java中BufferedImage判断图像通道顺序并转RGB/BGR
一般来说Java ImageIO处理读取图像时,一般是RGB或ARGB格式,但是有的时候,我们需要图像是BGR格式,
比如通过JNI将图像矩阵传递给动态库,动态库里用OpenCV来处理矩阵,而用OpenCV处理图像时默认通道顺序是BGR,这时就需要一个到BGR转换。
翻了好Java API好久,还真没发现有直接将RGB转BGR的方法,于是只好自己写一个,以下是代码片段,用于实现判断BufferedImage图像类型及通道顺序,并将BufferedImage转为RGB或BGR
实例代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
/** * @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; } |
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
原文链接:http://blog.csdn.net/10km/article/details/65444680