이 글에서는 Java의 BufferedImage가 이미지 채널의 순서를 결정하고 이를 RGB/BGR로 변환하는 방법에 대한 관련 정보를 주로 소개합니다. 필요한 친구는
Java의 BufferedImage가 이미지 채널의 순서를 결정하는 방법을 참조할 수 있습니다. RGB/BGR
일반적으로 Java ImageIO가 이미지를 처리하고 읽을 때 일반적으로 RGB 또는 ARGB 형식이지만 때로는 이미지가 필요한 경우도 있습니다. 예를 들어 BGR 형식은
JNI를 통해 이미지 매트릭스를 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!