Heim  >  Artikel  >  Java  >  Ausführliche Erläuterung, wie man BufferedImage in Java verwendet, um die Reihenfolge der Bildkanäle zu bestimmen und sie in ein RGB/BGR-Codebeispiel zu konvertieren

Ausführliche Erläuterung, wie man BufferedImage in Java verwendet, um die Reihenfolge der Bildkanäle zu bestimmen und sie in ein RGB/BGR-Codebeispiel zu konvertieren

黄舟
黄舟Original
2017-03-24 10:42:452091Durchsuche

In diesem Artikel werden hauptsächlich relevante Informationen darüber vorgestellt, wie BufferedImage in Java die Reihenfolge der Bildkanäle bestimmt und in RGB/BGR konvertiert. Freunde, die es benötigen, können sich auf

BufferedImage in Java beziehen Reihenfolge der Bildkanäle und konvertiert sie in RGB/BGR

Wenn Java ImageIO Bilder verarbeitet und liest, liegen sie normalerweise im RGB- oder ARGB-Format vor, aber manchmal benötigen wir das Bild in Das BGR-Format

übergibt beispielsweise die Bildmatrix an die dynamische Bibliothek, die OpenCV zur Verarbeitung der Matrix verwendet. In diesem Fall ist die Standardkanalreihenfolge a Umstellung auf BGR ist erforderlich.

Nachdem ich lange Zeit die Java-API durchgesehen hatte, fand ich wirklich keine Möglichkeit, RGB direkt in BGR zu konvertieren, also musste ich selbst Folgendes schreiben ist ein Codeausschnitt zur Implementierung der Bildtyp- und Kanalsequenz von BufferedImage und zur Konvertierung von BufferedImage in RGB oder BGR

Beispielcode:

 /**
   * @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;
  }

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung, wie man BufferedImage in Java verwendet, um die Reihenfolge der Bildkanäle zu bestimmen und sie in ein RGB/BGR-Codebeispiel zu konvertieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn