gpt4 book ai didi

java中如何使用BufferedImage判断图像通道顺序并转RGB/BGR

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章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 。

  实例代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/**
   * @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;
  }

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持! 。

原文链接:http://blog.csdn.net/10km/article/details/65444680 。

最后此篇关于java中如何使用BufferedImage判断图像通道顺序并转RGB/BGR的文章就讲到这里了,如果你想了解更多关于java中如何使用BufferedImage判断图像通道顺序并转RGB/BGR的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com