java中如何使用BufferedImage判断图像通道顺序并转RGB/BGR
java中BufferedImage判断图像通道顺序并转RGB/BGR
一般来说JavaImageIO处理读取图像时,一般是RGB或ARGB格式,但是有的时候,我们需要图像是BGR格式,
比如通过JNI将图像矩阵传递给动态库,动态库里用OpenCV来处理矩阵,而用OpenCV处理图像时默认通道顺序是BGR,这时就需要一个到BGR转换。
翻了好JavaAPI好久,还真没发现有直接将RGB转BGR的方法,于是只好自己写一个,以下是代码片段,用于实现判断BufferedImage图像类型及通道顺序,并将BufferedImage转为RGB或BGR
实例代码:
/** *@paramimage *@parambandOffset用于判断通道顺序 *@return */ privatestaticbooleanequalBandOffsetWith3Byte(BufferedImageimage,int[]bandOffset){ if(image.getType()==BufferedImage.TYPE_3BYTE_BGR){ if(image.getData().getSampleModel()instanceofComponentSampleModel){ ComponentSampleModelsampleModel=(ComponentSampleModel)image.getData().getSampleModel(); if(Arrays.equals(sampleModel.getBandOffsets(),bandOffset)){ returntrue; } } } returnfalse; } /** *判断图像是否为BGR格式 *@return */ publicstaticbooleanisBGR3Byte(BufferedImageimage){ returnequalBandOffsetWith3Byte(image,newint[]{0,1,2}); } /** *判断图像是否为RGB格式 *@return */ publicstaticbooleanisRGB3Byte(BufferedImageimage){ returnequalBandOffsetWith3Byte(image,newint[]{2,1,0}); } /** *对图像解码返回RGB格式矩阵数据 *@paramimage *@return */ publicstaticbyte[]getMatrixRGB(BufferedImageimage){ if(null==image) thrownewNullPointerException(); byte[]matrixRGB; if(isRGB3Byte(image)){ matrixRGB=(byte[])image.getData().getDataElements(0,0,image.getWidth(),image.getHeight(),null); }else{ //转RGB格式 BufferedImagergbImage=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格式矩阵数据 *@paramimage *@return */ publicstaticbyte[]getMatrixBGR(BufferedImageimage){ 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>8)&0xff); matrixBGR[j+2]=(byte)((intrgb[i]>>16)&0xff); } } returnmatrixBGR; }
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!