• 技术文章 >Java >java教程

    详解java中如何使用BufferedImage判断图像通道顺序并转RGB/BGR的代码案例

    黄舟黄舟2017-03-24 10:42:45原创972
    这篇文章主要介绍了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中文网其它相关文章!

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    上一篇:java中Set与Map排序输出到Writer的示例代码分享 下一篇:Getty-实现Java NIO框架设计的详解
    大前端线上培训班

    相关文章推荐

    • 理解java8中java.util.function.*pojo反射新方法(附代码)• 浅析安卓app和微信授权登录及分享完整对接(代码分享)• 一招教你使用java快速创建Map(代码分享)• 教你一招搞定时序数据库在Spring Boot中的使用• 一文讲解Java中初始化List集合的8种方式(附代码)

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网