Java图片读取之BufferedImage得到像素矩阵的两种方式

原创 2016年12月29日 16:19:35

最近在尝试着采用Java在图像处理领域实践一下常用的机器学习算法。首先涉及到的是如何将一副图片读取到一个像素矩阵中(Java中就是一维或二维数组中)。在实践过程中,通过测试代码,我发现基于BufferedImage可以有两种获取像素矩阵的方式,但需要注意像素点的保存顺序问题。
具体表现在:本例中的图片是一副彩色图片(博客头像),大小为425*292,即宽度(Width)为425,高度(Height)为292。
放上测试代码(刚测试完就放上来了,不要纠结细节),后面再说明:

/**
 * Created by Song on 2016/12/29.
 * 用于读取Image文件
 */
public final class ImgHandler {

    public static void getData(String path){
        try{
            BufferedImage bimg = ImageIO.read(new File(path));
            int [][] data = new int[bimg.getWidth()][bimg.getHeight()];
            //方式一:通过getRGB()方式获得像素矩阵
            //此方式为沿Height方向扫描
            for(int i=0;i<bimg.getWidth();i++){
                for(int j=0;j<bimg.getHeight();j++){
                    data[i][j]=bimg.getRGB(i,j);
                    //输出一列数据比对
                    if(i==0)
                        System.out.printf("%x\t",data[i][j]);
                }
            }
            Raster raster = bimg.getData();
            System.out.println("");
            int [] temp = new int[raster.getWidth()*raster.getHeight()*raster.getNumBands()];
            //方式二:通过getPixels()方式获得像素矩阵
            //此方式为沿Width方向扫描
            int [] pixels  = raster.getPixels(0,0,raster.getWidth(),raster.getHeight(),temp);
            for (int i=0;i<pixels.length;) {
                //输出一列数据比对
                if((i%raster.getWidth()*raster.getNumBands())==0)
                    System.out.printf("ff%x%x%x\t",pixels[i],pixels[i+1],pixels[i+2]);
                i+=3;
            }
        }catch (IOException e){
            e.printStackTrace();
        }

    }

    public static void main(String [] args){
        getData("E:\\a.jpg");
    }
}

在方式一中,getRGB()方法,根据手册,其返回的int型数据(32位)为ARGB格式,其中ARGB各占8bit。getRGB的两个参数x,y分别对应像素点的横纵坐标,但需注意的是,以图片左上角点为坐标原点,x轴正方向是沿着width方向的,y轴正方向是沿着Height方向的。不信的同学,可以试着把二者调换,就会发现系统会报数组溢出的异常。
在方式二中,像素会通过getPixels()方法被保存在一个一维数组中。其中temp数据为读取数据的缓冲区,其大小的确定一定要是其图像通道数(通过getNumBands()获得)的整数倍,例如这里的彩色图片有RGB三个通道,所以通道数就为3。在最终得到的结果一维数组中,一维数组的大小为Width*Height*NumBands。此处,一个像素点占三个位置(R,G,B),与方式一得到的值作比对时,才发现,这里的一维数组中,像素点的排列顺序是按着Width横向扫码得到的。
鉴于操作的便捷来说,个人肯定偏向于方向一,首先它把RGB值整合到了一起,不像方式二中是分开的三个int数,二是二维数组相较于一维数组,肯定更加接近矩阵的概念,便于运算。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013248535/article/details/53929605

JAVA中BufferedImage的用法

1.用到的包 public static void main(String[] args) { // TODO Auto-generated method stub in...
  • pangesange
  • pangesange
  • 2017-01-13 21:17:15
  • 20181

Java之BufferedImage简谈

1. 创建一个BufferedImage对象: import java.awt.Frame; import java.awt.Graphics; import java.awt.Gr...
  • u012481520
  • u012481520
  • 2016-07-01 16:23:47
  • 4791

Java用BufferedImage和Graphics画图

解决:先用Graphics的方法setColor设置一下颜色,然后再用该类的fillRect填充背景色,接着再用该类的setColor设置一下颜色,再接着就是用该类的drawString画字了。Ima...
  • CHS007chs
  • CHS007chs
  • 2016-07-27 16:41:19
  • 2828

java:从sRGB字节流(byte[])创建BufferedImage

有时候我们需要从字节流byte[]创建一个BufferedImage对象,比如将jni层返回的图像数据转为BufferedImage对象并显示出来。BufferedImage类中的BufferedIm...
  • 10km
  • 10km
  • 2016-07-10 16:44:31
  • 1568

java:图像(BufferedImage)色彩空间转换(灰度)暨获取图像矩阵数据byte[](sRGB/gray)

ColorConvertOpjava.awt.image包下面有个类java.awt.image.ColorConvertOp,类名直译就是”颜色转换操作”。 顾名思义,它的作用就是将一个色彩空间(...
  • 10km
  • 10km
  • 2016-07-09 17:55:41
  • 3935

java使用BufferedImage操作合成图片

使用java对图片进行加工处理
  • leeking888
  • leeking888
  • 2016-07-05 15:09:26
  • 4489

java : 调用ImageIO.writer从BufferedImage生成jpeg图像的坑

生成jpeg图像这是个非常非常简单的东西了,ImageIO.writer方法可以生成指定的格式的图像,我原先是这样写的,就是简单的调用ImageIO.writer方法生成jpeg数据: /** ...
  • 10km
  • 10km
  • 2017-01-17 16:14:44
  • 5626

BufferedImage操作图片笔记

BufferedImage是Image的一个子类,BufferedImage生成的图片在内存里有一个图像缓冲区,利用这个缓冲区我们可以很方便的操作这个图片,通常用来做图片修改操作如大小变换、图片变灰、...
  • fykhlp
  • fykhlp
  • 2011-02-24 12:29:00
  • 46544

Java生成图片时使用BufferedImage的构造方法,让图片不失真

在一次做考试系统的时候,有一个场景是考生开考前需要通过系统做拍照并进行脸部信息的比对;脸部信息的计算使用FACE++(旷视科技)的接口,但是发现查看拍照的照片信息是,考生的照片显示十分模糊,对比度变低...
  • T_zm_cross
  • T_zm_cross
  • 2016-07-07 17:35:16
  • 11134
收藏助手
不良信息举报
您举报文章:Java图片读取之BufferedImage得到像素矩阵的两种方式
举报原因:
原因补充:

(最多只允许输入30个字)