【浅谈java图片原理与处理】

有没有想过,生活中的图片,是怎样呈现在电脑屏幕上的?

实际上,电脑屏幕上所呈现的内容,都是由计算机二进制的0与1处理而来。

——————第一部分——————

一、像素

首先,我们熟知像素是图片组成的要素。我们看到的图片经过放大,可以看出“马赛克”,即每一个小格子都为一种颜色。即三原色。每个格子对应一个像素值。

像素:是指在由一个数字序列表示的图像中的一个最小单位,称为像素。

例如手机像素几千万,4K画质,分辨率1080p,1960*1080,即屏幕的长与宽。

我们熟悉的数据类型,有bit(二进制),byte(字节),short(短整型),int(整型),long(长整型);

二、三原色

我们所说的三原色:红色、绿色、蓝色,在java中以RGB来进行处理。

一个个三原色像素点,组成了一幅图片,r -red,g-green,b-blue;

每个像素值在0-255*255*255之间,我们用R,G,B三个值来表示一个颜色。

颜色的区间为0-255,三个颜色的组合又形成不同的颜色。

比如像素值16,581,375写成(255,255,255),对应白色。

像素值0写成(0,0,0),对应黑色。

三原色之间比例的组合,可以实现生成生活中的其他颜色,

三、储存图像

在java里,我们可以用二维数组来存储图片。

将每一行每一列对应的像素点储存在二维数组中的arr[i][j],对应位置中。

——————第二部分——————

一、处理图像(用代码实现)

JFrame的相关信息可以参考这位大佬:JFrame的使用方法_oldsweet老甜甜的博客-CSDN博客_jframe

写一个处理图像的类ImagePad,继承JFrame,显示界面,储存图像,显示图像的相关操作方法均放在该类。

public class ImagePad extend JFrame(){/*** 1、主函数方法*/
public static void main(String[] args){ ImagePad imgpad = new ImagePad (); imgpad.initUI (); }/*** 2、生成界面的方法*/    public void initUI(){ /*** 因为ImagePad为继承类,所以可以用this来调用setTitle等JFrame中的方法;*///设置标题this.setTitle ("图像处理"); this.setSize (800, 800); this.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); //在可视化之后获取this.setVisible (true); }/*** 3、将图像转换为二维数组的方法*/public int[][] getPixelArray(String imgPath){ // 根据图片地址 生成一个file对象 ,file 对象读取File file = new File (imgPath); // 声明一个BUfferedImage变量名 BufferedImage buffimg = null; // 使用图片IO读取文件 try { buffimg = ImageIO.read (file); } catch (IOException e) { e.printStackTrace (); }// 获取宽度 高度 int w = buffimg.getWidth (); int h = buffimg.getHeight (); // 定义一个与图片像素宽高一致的二维数组 int[][] imgarr = new int[w][h]; // 遍历BufferedImage 获取RGB值 存储 数组中 for(int i = 0; i < w; i++){ for(int j = 0; j < h; j++){ imgarr[i][j] = buffimg.getRGB (i, j); }}// 将存好像素值的数组 返回 return imgarr; }//————————————————————————————————————————————————————————————————————————————————/*** 4、绘制图片的方法* */public void paint(Graphics g){ super.paint (g);  //申请一个二维数组,用来储存图片信息int[][] imgarr = getPixelArray ("此处填写文件路径");    //示例:                     路径\\文件名.后缀// ("C:\\Users\\Desktop\\picture\\picture2.jpeg"); int w = imgarr.length; int h = imgarr[0].length; /** 第一种方法:绘制原图绘制原图 **/ public void drawImage_01(int[][] imgarr,Graphics g) {for(int i=0;i

 

接下来可以换其他的方法

第二种:灰度图

/** 第二种方法:绘制灰度图 **/ 
for(int i = 0; i < w; i++){ for(int j = 0; j < h; j++){ int rgb = imgarr[i][j]; Color color = new Color (rgb); int red = color.getRed();int blue = color.getBlue();int green = color.getGreen();int gray = (red+blue+green)/3;Color ncolor = new Color(gray,gray,gray);			g.setColor(ncolor);  	g.fillRect(100+i,100+j,1,1); }
}
/** 第二种方法:绘制灰度图 **/ 

 

第三种:二值化图

/** 第三种方法:绘制二值化图 **/ 
for(int i = 0; i < w; i++){ for(int j = 0; j < h; j++){ int rgb = imgarr[i][j]; Color color = new Color (rgb); //此处可以添加三原色的选择结果,用于滤镜处理;int red = color.getRed();int blue = color.getBlue();int green = color.getGreen();int gray = (red+blue+green)/3;Color ncolor = new Color(gray,gray,gray);// 二值化 在灰度的基础上 通过灰度值来判断  if(gray < 80){ g.setColor (Color.BLACK); } 			else{ g.setColor (Color.WHITE); }g.fillRect (100 + i, 100 + j, 1, 1);}	}}  /** 第三种方法:绘制二值化图 **/                                                 

 

二、分部剖析详解:

        1、主函数部分,创建一个类对象,用类对象创建成员方法

//主函数部分
public static void main(String[] args) {ImagePad imgPad = new ImagePad();imgPad.intUI();}

       2、生成函数界面部分,直接用this来调用方法设置标题,设置大小,设置退出方法,设置可视化;

    /*** 2、生成界面的方法*/    public void initUI(){ /*** 因为ImagePad为继承类,所以可以用this来调用setTitle等JFrame中的方法;*///设置标题this.setTitle ("图像处理"); this.setSize (800, 800); this.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); //在可视化之后获取this.setVisible (true); }

        3、将图像转换为二维数组的方法部分

/*** 3、将图像转换为二维数组的方法*/public int[][] getPixelArray(String imgPath){ // 根据图片地址 生成一个file对象 ,file 对象读取File file = new File (imgPath); // 声明一个BUfferedImage变量名 BufferedImage buffimg = null; // 使用图片IO读取文件 try { buffimg = ImageIO.read (file); } catch (IOException e) { e.printStackTrace (); }// 获取宽度 高度 int w = buffimg.getWidth (); int h = buffimg.getHeight (); // 定义一个与图片像素宽高一致的二维数组 int[][] imgarr = new int[w][h]; // 遍历BufferedImage 获取RGB值 存储 数组中 for(int i = 0; i < w; i++){ for(int j = 0; j < h; j++){ imgarr[i][j] = buffimg.getRGB (i, j); }}// 将存好像素值的数组 返回 return imgarr; }

        4、

 /*
*    4、绘制图像部分
*/
public void paint(Graphics g){ super.paint (g);  //申请一个二维数组,用来储存图片信息int[][] imgarr = getPixelArray ("此处填写文件路径");    //示例:                     路径\\文件名.后缀// ("C:\\Users\\Desktop\\picture\\picture2.jpeg"); int w = imgarr.length; int h = imgarr[0].length; /** 第一种方法:绘制原图绘制原图 **/ public void drawImage_01(int[][] imgarr,Graphics g) {for(int i=0;i

总结:

在界面上显示出图片,原理为导入图片文件,获取图片的高和宽,将每一个像素点存在数组中南,将图片文件转换为二维数组,最后利用绘制图片的方法将图片绘制出。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章