這篇文章主要介紹了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 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; }
以上是詳解java中如何使用BufferedImage判斷影像頻道順序並轉RGB/BGR的程式碼案例的詳細內容。更多資訊請關注PHP中文網其他相關文章!