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; } |
茶杯头甜蜜终章dlc 官方手机版v1.0.0.3
下载火柴人传说暗影格斗内置菜单 最新版v3.0.1
下载荒野乱斗测试服 安卓版v61.10.3
下载荒野乱斗彩虹服 安卓版v61.10.3
下载寒霜启示录 安卓版v1.25.10
寒霜启示录是一款生存模拟游戏,不少玩家可能对于末日都有着自己
末日城堡免广告版 安卓最新版v0.7.1
末日城堡免广告版是一款非常好玩的模拟经营类游戏,内部可以不看
甜蜜人生模拟器 最新版v1.4.5
甜蜜人生模拟器是一款非常好玩的模拟恋爱手游,玩家在这里能够对
武器锻造师内置功能菜单 v10.4
武器锻造师内置菜单版是游戏的破解版本,在该版本中为玩家提供了
开放空间overfield 安卓版v1.0.5
开放空间Overfield是一款箱庭养成经营手游,让你在广阔