图像的原理
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);
}
}
效果如下:
这样我们就对图像处理有了初步的理解。