>  기사  >  Java  >  Java에서 BufferedImage를 사용하여 이미지 채널의 순서를 결정하고 이를 RGB/BGR 코드 예제로 변환하는 방법에 대한 자세한 설명

Java에서 BufferedImage를 사용하여 이미지 채널의 순서를 결정하고 이를 RGB/BGR 코드 예제로 변환하는 방법에 대한 자세한 설명

黄舟
黄舟원래의
2017-03-24 10:42:452037검색

이 글에서는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.