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