ホームページ  >  記事  >  Java  >  Java で BufferedImage を使用して画像チャネルの順序を決定し、RGB/BGR コード例に変換する方法の詳細な説明

Java で BufferedImage を使用して画像チャネルの順序を決定し、RGB/BGR コード例に変換する方法の詳細な説明

黄舟
黄舟オリジナル
2017-03-24 10:42:452036ブラウズ

この記事では、Java の BufferedImage がどのように画像チャネルの順序を決定し、RGB/BGR に変換するかについての関連情報を主に紹介します。必要な友達はそれを参照してください

Java の BufferedImage は画像チャネルの順序を決定し、それを変換します。 RGB/BGR へ

一般的に、画像を読み取るための Java ImageIO 処理に関しては、通常は RGB または ARGB 形式ですが、場合によっては画像を BGR 形式にする必要があります。たとえば、画像行列は次のとおりです。が JNI 経由でダイナミック ライブラリに渡され、ダイナミック ライブラリで OpenCV が使用されてマトリックスが処理されます。OpenCV を使用して画像を処理する場合、デフォルトのチャネル順序は BGR であるため、BGR への変換が必要です。


長い間 Java

API

を読んできましたが、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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。