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

作者:简简单单 2017-07-25

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

  */

 privatestaticbooleanequalBandOffsetWith3Byte(BufferedImage image,int[] bandOffset){

   if(image.getType()==BufferedImage.TYPE_3BYTE_BGR){

     if(image.getData().getSampleModel()instanceofComponentSampleModel){

       ComponentSampleModel sampleModel = (ComponentSampleModel)image.getData().getSampleModel();

       if(Arrays.equals(sampleModel.getBandOffsets(), bandOffset)){

         returntrue;

       }

     }

   }

   returnfalse;   

 }

 /**

  * 判断图像是否为BGR格式

  * @return

  */

 publicstaticbooleanisBGR3Byte(BufferedImage image){

   returnequalBandOffsetWith3Byte(image,newint[]{0,1,2});

 }

 /**

  * 判断图像是否为RGB格式

  * @return

  */

 publicstaticbooleanisRGB3Byte(BufferedImage image){

   returnequalBandOffsetWith3Byte(image,newint[]{2,1,0});

 }

 /**

  * 对图像解码返回RGB格式矩阵数据

  * @param image

  * @return

  */

 publicstaticbyte[] getMatrixRGB(BufferedImage image) {

   if(null==image)

     thrownewNullPointerException();

   byte[] matrixRGB;

   if(isRGB3Byte(image)){

     matrixRGB= (byte[]) image.getData().getDataElements(0,0, image.getWidth(), image.getHeight(),null);

   }else{

     // 转RGB格式

     BufferedImage rgbImage =newBufferedImage(image.getWidth(), image.getHeight(),

         BufferedImage.TYPE_3BYTE_BGR);

     newColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_sRGB),null).filter(image, rgbImage);

     matrixRGB= (byte[]) rgbImage.getData().getDataElements(0,0, image.getWidth(), image.getHeight(),null);

   }

   returnmatrixRGB;

 }

 /**

  * 对图像解码返回BGR格式矩阵数据

  * @param image

  * @return

  */

 publicstaticbyte[] getMatrixBGR(BufferedImage image){

   if(null==image)

     thrownewNullPointerException();

   byte[] matrixBGR;

   if(isBGR3Byte(image)){

     matrixBGR= (byte[]) image.getData().getDataElements(0,0, image.getWidth(), image.getHeight(),null);

   }else{    

     // ARGB格式图像数据

     intintrgb[]=image.getRGB(0,0, image.getWidth(), image.getHeight(),null,0, image.getWidth());

     matrixBGR=newbyte[image.getWidth() * image.getHeight()*3];

     // ARGB转BGR格式

     for(inti=0,j=0;i

       matrixBGR[j]=(byte) (intrgb[i]&0xff);

       matrixBGR[j+1]=(byte) ((intrgb[i]>>8)&0xff);

       matrixBGR[j+2]=(byte) ((intrgb[i]>>16)&0xff);

     }

   }

   returnmatrixBGR;

 }

 

相关文章

精彩推荐