【浅谈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
总结:
在界面上显示出图片,原理为导入图片文件,获取图片的高和宽,将每一个像素点存在数组中南,将图片文件转换为二维数组,最后利用绘制图片的方法将图片绘制出。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
