有没有想过,生活中的图片,是怎样呈现在电脑屏幕上的?
实际上,电脑屏幕上所呈现的内容,都是由计算机二进制的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(){ public static void main(String[] args) { ImagePad imgpad = new ImagePad (); imgpad.initUI (); } public void initUI(){ //设置标题 this.setTitle ("图像处理"); this.setSize (800, 800); this.setDefaultCloseOperation (Jframe.EXIT_ON_CLOSE); //在可视化之后获取 this.setVisible (true); } 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; } //———————————————————————————————————————————————————————————————————————————————— 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来调用方法设置标题,设置大小,设置退出方法,设置可视化;
public void initUI(){ //设置标题 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
总结:
在界面上显示出图片,原理为导入图片文件,获取图片的高和宽,将每一个像素点存在数组中南,将图片文件转换为二维数组,最后利用绘制图片的方法将图片绘制出。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)