一般来说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的更多相关文章

  1. matplotlib、PIL、cv2图像操作 && caffe / tensorflow 通道顺序

    用python进行图像处理中分别用到过matplotlib.pyplot.PIL.cv2三种库,这三种库图像读取和保存方法各异,并且图像读取时顺序也有差异,如plt.imread和PIL.Image. ...

  2. Halcon学习之三:有关图像通道的函数(R是三通道,B是1通道,G二通道),排列顺序BGR

    黑白摄像机会返回每个像素所对应的能量采用结果,这些结果组成了一幅单通道灰度值图像,而对于RGB彩色摄像机,它将返回每个像素所对应的三个采样结果,也就是一幅三通道图像.下面这些是与图像通道有关的函数: ...

  3. Java OCR tesseract 图像智能字符识别技术 Java实现

    Java OCR tesseract 图像智能字符识别技术 Java代码实现 接着上一篇OCR所说的,上一篇给大家介绍了tesseract 在命令行的简单用法,当然了要继承到我们的程序中,还是需要代码 ...

  4. OpenCV-3.4.3图像通道处理

    图像通道处理 图像读取和处理都是按BGR通道顺序进行的 #include <iostream> #include <opencv2/opencv.hpp> #include & ...

  5. Java——BufferedImage操作实例

    通过鼠标位置改变图像ColorModel对象索引,从而实现图像像素自动变化 BufferedImage 由图像数据的 ColorModel 和 Raster 组成.Raster 的 SampleMod ...

  6. Java类的基本运行顺序

    不看不知道,一看还真吓了一跳!Java类的基本运行顺序你真的知道吗?如果你有疑惑,那就看下面这篇文章吧.   原文出自:[url]http://column.ibeifeng.com/chenchen ...

  7. 用python简单处理图片(2):图像通道\几何变换\裁剪

    一.图像通道 1.彩色图像转灰度图 from PIL import Image import matplotlib.pyplot as plt img=Image.open('d:/ex.jpg') ...

  8. Java 类成员的初始化顺序

    Java 类成员的初始化顺序 前言:开发中碰到一个Java文件中有很多的成员变量,包括静态和非静态的,还有很多的初始化方法,很好奇这些成员的初始化顺序,在这里作个研究.   1  无继承情况下的Jav ...

  9. Java中的成员初始化顺序和内存分配过程

    Java中的成员初始化顺序和内存分配过程 原帖是这样描述的: http://java.dzone.com/articles/java-object-initialization?utm_source= ...

随机推荐

  1. redis配置cluster分布式集群

    #下载最新的redis5. wget http://download.redis.io/releases/redis-5.0.3.tar.gz .tar.gz cd redis- make make ...

  2. angular 创建项目

    介绍有很多可用的工具可以帮助你开发AngularJS 应用,那些非常复杂的框架不在我的讨论范围之中,这也是我开始这系列教程的原因.在第一部分,我们掌握了angularjs框架的基本结构,开发了第一应用 ...

  3. [jenkins学习篇] 安装jenkins

    1 下载war包,https://jenkins.io/download/ 2 安装jar包,java -jar jenkins.war 3 打开网址:http://localhost:8080 4 ...

  4. ajax原生post请求

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. MAC生成公钥私钥

    前言 需要开发者在本地上使用openssl来生成私钥和公钥 由于mac 自带openssl工具,所以不用像windows那样要下载安装openssl工具 步骤 1.创建一个文件夹,终端进入该文件夹 c ...

  6. [UOJ#223][BZOJ4654][Noi2016]国王饮水记

    [UOJ#223][BZOJ4654][Noi2016]国王饮水记 试题描述 跳蚤国有 n 个城市,伟大的跳蚤国王居住在跳蚤国首都中,即 1 号城市中.跳蚤国最大的问题就是饮水问题,由于首都中居住的跳 ...

  7. 雅礼培训 Problem A 【线段树】

    题意 维护一段区间,支持求区间最大值,区间且,区间或 \(n,q<=2*10^5\) 题解 我们用线段树维护区间最大值 对于and和or运算, and实质就是强行把一些位改为0 or实质就是强行 ...

  8. sqlserver通过设计器修改表结构保存时提示:保存到文本问题

    在sqlserver通过设计器修改表结构后保存时提示:保存到文本问题,这个问题可能通过修改设置项解决 工具>选项>设计器>   在弹出的窗口是把“阻止保存要求重新创建表的更改”选项的 ...

  9. TYVJ3680 找妹子

    时间: 1000ms / 空间: 1200KiB / Java类名: Main 背景 本题由 @fjzzq2002 提供,已奖励20金币. 描述 sps是zzq的好伙伴. sps一天叫来了许多个妹子. ...

  10. excel打乱各行的顺序,实现无序随机排列

    由于公司做活动,经常会发些激活码过来,为了让激活码能够充分使用,经常要打乱激活码的顺序,百度了下,看了下网上的介绍,还不错,挺实用,记录下来. 具体方法如下: 1.将文本里的内容复制到Excel里的任 ...