一.图像像素原理
- 每一张图像是由多个数量的像素点所组成的。
- 分辨率是指单位面积内的像素点的数量。
- 例如:1980*1080
每一个像素点的颜色表达: RGB
R G B: 0-255 256个 8bit 256256256 0 255 255
数据--处理 --显示 字节 二进制码
单位: bit 比特,位
整数型: byte short int long (-128 +127) -- (1000 - 1255)共 256个
二. 像素的储存
每一个 rgb 颜色有 32位
R G B
R:1000 0000
把 三个byte存入 一个 int 中
0000 0000 32位 (alpha 表示透明度)
1000 0000 24位 R
1000 0000 16位 G
1000 0000 低八位 B
RGB
三. 存取:位运算操作符:<< >> & | ^
按位操作: >> 位移运算符
R >> 16
G >> 8
B >> 0
如何从 rgb 值中分别取出r,g,b 值
step 1 : write the decimal number into binary form
8,421,504=
0000 0000 32位
1000 0000 24位 R
1000 0000 16位 G
1000 0000 低八位 B
step 2: 移位
r: 整个32位数向右移动 16位数
0000 0000
0000 0000 R
0000 0000
1000 0000
g: 整个32位数向右移动 8位数
0000 0000
0000 0000
1000 0000 g
1000 0000
b: 整个32位数向右移动 0位数
0000 0000
1000 0000
1000 0000
1000 0000
step 3 取最后 8位数
0xFF : 低八位全为1的数
R G
0000 0000 0000 0000 1000 0000 1000 0000
& 0000 0000 0000 0000 0000 0000 1111 1111 相同保留 不同为1
0000 0000 0000 0000 0000 0000 1000 0000
四。基本效果
```c int rgb = 8421504; // 整数拆分为 3 个 byte int red = (rgb >> 16)&0xFF; System.out.println ("red:"+red); int green = (rgb >> 8)&0xFF; System.out.println ("green:"+green); int blue = (rgb >> 0)&0xFF; System.out.println ("blue:"+blue); // 3 个byte 合成一个整数 ```import javax.swing.*;
import java.awt.*;
import java.util.Random;
public class ImagePad extends JFrame {
public ImagePad(){
setTitle ("像素画");
setSize (1800,800);
setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo (null);
setVisible (true);
}
// 重写方法 JFrame 本身的绘制方法 paint
// Graphics 图形 -- 很多函数可以来绘制一些基础图形
/** *
* @param g
* setColor();
* drawLine Rect Oval
* fillRect Oval
// //
Color rgbcolor= new Color(red, green, blue);
rgbcolor.getRGB ();
int value = ((255 & 0xFF) << 24) |
((red & 0xFF) << 16) |
((green & 0xFF) << 8) |
((blue & 0xFF) << 0);
colorArr[i][j]= value;
* * */
@Override
public void paint (Graphics g) { super.paint (g);
//000 黑色 255255255 白色
Color color= new Color(255, 255, 255);
g.setColor (color);
g.fillRect (100,100,500,500);
// 随机数
Random random = new Random ();
random.nextInt (256);// [0 bound)
// 随机一个数组的像素值
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);
} }
// 绘制原始图形
for (int i = 0; i < 500; i++) {
for (int j = 0; j < 500; j++) {
Color color1 = new Color (colorArr[i][j]);
} }
g.setColor g.fillRect
(color1);
(100+i,100+j,1,1);
// 扩展处理 rgb 配比
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 (gray,gray,gray);
g.setColor (color1);
g.fillRect (610+i,100+j,20,20);
public static void main (String[] args) {
new ImagePad ();// 显示界面
}
}