In diesem Artikel werden hauptsächlich relevante Informationen darüber vorgestellt, wie BufferedImage in Java die Reihenfolge der Bildkanäle bestimmt und in RGB/BGR konvertiert. Freunde, die es benötigen, können sich auf
BufferedImage in Java beziehen Reihenfolge der Bildkanäle und konvertiert sie in RGB/BGR
Wenn Java ImageIO Bilder verarbeitet und liest, liegen sie normalerweise im RGB- oder ARGB-Format vor, aber manchmal benötigen wir das Bild in Das BGR-Format
übergibt beispielsweise die Bildmatrix an die dynamische Bibliothek, die OpenCV zur Verarbeitung der Matrix verwendet. In diesem Fall ist die Standardkanalreihenfolge a Umstellung auf BGR ist erforderlich.
Nachdem ich lange Zeit die Java-API durchgesehen hatte, fand ich wirklich keine Möglichkeit, RGB direkt in BGR zu konvertieren, also musste ich selbst Folgendes schreiben ist ein Codeausschnitt zur Implementierung der Bildtyp- und Kanalsequenz von BufferedImage und zur Konvertierung von BufferedImage in RGB oder BGR
Beispielcode:
/** * @param image * @param bandOffset 用于判断通道顺序 * @return */ private static boolean equalBandOffsetWith3Byte(BufferedImage image,int[] bandOffset){ if(image.getType()==BufferedImage.TYPE_3BYTE_BGR){ if(image.getData().getSampleModel() instanceof ComponentSampleModel){ ComponentSampleModel sampleModel = (ComponentSampleModel)image.getData().getSampleModel(); if(Arrays.equals(sampleModel.getBandOffsets(), bandOffset)){ return true; } } } return false; } /** * 判断图像是否为BGR格式 * @return */ public static boolean isBGR3Byte(BufferedImage image){ return equalBandOffsetWith3Byte(image,new int[]{0, 1, 2}); } /** * 判断图像是否为RGB格式 * @return */ public static boolean isRGB3Byte(BufferedImage image){ return equalBandOffsetWith3Byte(image,new int[]{2, 1, 0}); } /** * 对图像解码返回RGB格式矩阵数据 * @param image * @return */ public static byte[] getMatrixRGB(BufferedImage image) { if(null==image) throw new NullPointerException(); byte[] matrixRGB; if(isRGB3Byte(image)){ matrixRGB= (byte[]) image.getData().getDataElements(0, 0, image.getWidth(), image.getHeight(), null); }else{ // 转RGB格式 BufferedImage rgbImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_3BYTE_BGR); new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_sRGB), null).filter(image, rgbImage); matrixRGB= (byte[]) rgbImage.getData().getDataElements(0, 0, image.getWidth(), image.getHeight(), null); } return matrixRGB; } /** * 对图像解码返回BGR格式矩阵数据 * @param image * @return */ public static byte[] getMatrixBGR(BufferedImage image){ if(null==image) throw new NullPointerException(); byte[] matrixBGR; if(isBGR3Byte(image)){ matrixBGR= (byte[]) image.getData().getDataElements(0, 0, image.getWidth(), image.getHeight(), null); }else{ // ARGB格式图像数据 int intrgb[]=image.getRGB(0, 0, image.getWidth(), image.getHeight(), null, 0, image.getWidth()); matrixBGR=new byte[image.getWidth() * image.getHeight()*3]; // ARGB转BGR格式 for(int i=0,j=0;i<intrgb.length;++i,j+=3){ matrixBGR[j]=(byte) (intrgb[i]&0xff); matrixBGR[j+1]=(byte) ((intrgb[i]>>8)&0xff); matrixBGR[j+2]=(byte) ((intrgb[i]>>16)&0xff); } } return matrixBGR; }
Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung, wie man BufferedImage in Java verwendet, um die Reihenfolge der Bildkanäle zu bestimmen und sie in ein RGB/BGR-Codebeispiel zu konvertieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!