首页 > 开发 > Java > 正文

java中如何使用BufferedImage判断图像通道顺序并转RGB/BGR

2024-07-13 10:05:45
字体:
来源:转载
供稿:网友

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教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表