この記事では、Java の BufferedImage がどのように画像チャネルの順序を決定し、RGB/BGR に変換するかについての関連情報を主に紹介します。必要な友達はそれを参照してください
Java の BufferedImage は画像チャネルの順序を決定し、それを変換します。 RGB/BGR へ
一般的に、画像を読み取るための Java ImageIO 処理に関しては、通常は RGB または ARGB 形式ですが、場合によっては画像を BGR 形式にする必要があります。たとえば、画像行列は次のとおりです。が JNI 経由でダイナミック ライブラリに渡され、ダイナミック ライブラリで OpenCV が使用されてマトリックスが処理されます。OpenCV を使用して画像を処理する場合、デフォルトのチャネル順序は BGR であるため、BGR への変換が必要です。
長い間 Java
を読んできましたが、RGB を BGR に直接変換する方法が見つからなかったので、自分で書かなければなりませんでした。 以下は、BufferedImage 画像タイプを決定するためのコード スニペットです。チャンネル順序を変更し、BufferedImage を RGB または BGR に変換します コード例:
/** * @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; }
以上がJava で BufferedImage を使用して画像チャネルの順序を決定し、RGB/BGR コード例に変換する方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。