您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關java使用BufferedImage如何實現將圖像轉為RGB/BGR格式,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
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 */ private static boolean equalBandOffsetWith4Byte(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 equalBandOffsetWith4Byte(image,new int[]{0, 1, 2}); } /** * 判斷圖像是否為RGB格式 * @return */ public static boolean isRGB3Byte(BufferedImage image){ return equalBandOffsetWith4Byte(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; }
看完上述內容,你們對java使用BufferedImage如何實現將圖像轉為RGB/BGR格式有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。