最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
java中如何使用BufferedImage判断图像通道顺序并转RGB/BGR
时间:2022-06-29 01:26:00 编辑:袖梨 来源:一聚教程网
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; } |
相关文章
- 《燕云十六声》红尘无眼完成图文攻略 12-25
- 《燕云十六声》阴阳如影完成图文攻略 12-25
- 《燕云十六声》悬檐之下四架椽屋图文攻略 12-25
- 《燕云十六声》2024最新公测时间介绍 12-25
- 《燕云十六声》有没有藏宝阁 12-25
- 《燕云十六声》制作公司介绍 12-25