萌新图像处理(一)

图像的原理
http://www.lizibuluo.com/8bit/
这个网站就是一个随意的绘图的网站,可以看到很多小方块。这些小方块就是像素。
像素是指由图像的小方格组成的,这些小方块都有一个明确的位置和被分配的色彩数值,小方格颜色和位置就决定该图像所呈现出来的样子。
可以将像素视为整个图像中不可分割的单位或者是元素。不可分割的意思是它不能够再切割成更小单位抑或是元素,它是以一个单一颜色的小格存在 。每一个点阵图像包含了一定量的像素,这些像素决定图像在屏幕上所呈现的大小。
图像的另一个组成元素就是—分辨率。分辨率决定了位图图像细节的精细程度。
通常情况下,图像的分辨率越高,所包含的像素就越多,图像就越清晰,印刷的质量也就越好。同时,它也会增加文件占用的存储空间。常见的分辨率就有1980x1080等。
像素值的存取
存取的基本思路就是把一张图片,或者一些像素值,转化成一个二维数组。一般用的颜色就是R G B,新建一个数组,这个数组中的每个点,就是一个颜色的元素,然后再把数组中的每个点画出来即可。

上代码
说了这么多我们先上代码。先写一个界面,继承JFrame。`

public class ImagePad extends JFrame {
	public ImagePad(){
		setTitle ("像素画");
		setSize (1800,800);
		setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
		setLocationRelativeTo (null);
		setVisible (true);			
	}
public static void main (String[] args) {
		new ImagePad ();// 显示界面
	}

然后我们需要重写 JFrame 本身的绘制方法 paint。

public void paint (Graphics g){
		super.paint(g);
		//随机数
		Random random = new Random();
		random.nextInt(256); // 从0开始数256个  【0,256)
		//随机一个数组的像素值
		int [][] colorArr = new int[500][500];
		//遍历
		for (int i = 0; i < 500; i++) {
			for (int j = 0; j < 500; j++) {
			int red = random.nextInt (256);
			int green = random.nextInt (256);
			int blue = random.nextInt (256);
			int value = ((255 & 0xFF) << 24) |
					((red & 0xFF) << 16) |
					((green & 0xFF) << 8) |
					((blue & 0xFF) << 0);
					colorArr[i][j]= value;
			}
		}
		// 绘制原始图形
		for (int i = 0; i < 500; i++) {
		for (int j = 0; j < 500; j++) {
		Color color1 = new Color (colorArr[i][j]);
		g.setColor (color1);
		g.fillRect (100+i,100+j,1,1);
		}
		}

这样我们就绘制了一个随机颜色的像素画。

像素画
前面讲到,一张图片,可以转化为二维数组,我们处理数组里面的元素,就可以处理图片了。比如我们可以做上面这张图片的马赛克处理。

//马赛克
		for (int i = 0; i < 500; i+=20) {
		for (int j = 0; j < 500; j+=20) {
		int value = colorArr[i][j];
		int red = (value>>16)&0xFF;
		int green = (value>>8)&0xFF;
		int blue = (value>>0)&0xFF;		
		int gray = (red+green+blue)/3;
		Color color1 = new Color (red,green,blue);
		g.setColor (color1);
		g.fillRect (610+i,100+j,20,20);
		}
		}

效果如下图:
在这里插入图片描述
以此类推,把RGB值都分别减小,就可以得到灰度处理。

//灰度处理
		for (int i = 0; i < 500; i++) {
		for (int j = 0; j < 500; j++) {
		int value = colorArr[i][j];
		int red = (value>>16)&0xFF;
		int green = (value>>8)&0xFF;
		int blue = (value>>0)&0xFF;		
		int gray = (red+green+blue)/3;	
		Color color2 = new Color(gray,gray,gray);
		g.setColor(color2);
		g.fillRect(1120+i,100+j, 1, 1);
		}	
		}

效果如下:
在这里插入图片描述
这样我们就对图像处理有了初步的理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值