java中BufferedImage判斷圖像通道順序并轉(zhuǎn)RGB/BGR
一般來說Java ImageIO處理讀取圖像時,一般是RGB或ARGB格式,但是有的時候,我們需要圖像是BGR格式,
比如通過JNI將圖像矩陣傳遞給動態(tài)庫,動態(tài)庫里用OpenCV來處理矩陣,而用OpenCV處理圖像時默認(rèn)通道順序是BGR,這時就需要一個到BGR轉(zhuǎn)換。
翻了好Java API好久,還真沒發(fā)現(xiàn)有直接將RGB轉(zhuǎn)BGR的方法,于是只好自己寫一個,以下是代碼片段,用于實現(xiàn)判斷BufferedImage圖像類型及通道順序,并將BufferedImage轉(zhuǎn)為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格式矩陣數(shù)據(jù) * @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 { // 轉(zhuǎn)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格式矩陣數(shù)據(jù) * @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格式圖像數(shù)據(jù) int intrgb[]=image.getRGB( 0 , 0 , image.getWidth(), image.getHeight(), null , 0 , image.getWidth()); matrixBGR= new byte [image.getWidth() * image.getHeight()* 3 ]; // ARGB轉(zhuǎn)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