图像原理
一张照片如何显示在屏幕上
- 像素:分辨率决定单位面积里的像素点个数
- 像素矩阵:像素点的值——颜色表达:R G B:0-255(共256(2^8/8Bit)个)
- 单位:bit (比特)位。
- 整数型:Byte(8)short(16) int(32/max:2^31 -1) long(64/max:2^63-1)
- 数据- 处理 - 显示 字节/二进制码-处理 - 显示出来
像素值的存储
二维数组
把3个byte存入一个Int (一个int 是 4组 byte )
R B G
0000 0000 - 32位 (平平无奇的木马病毒聚集地)
0000 0000 - 24位 R
0000 0000 - 16位 G
0000 0000 - 低八位 B
存取
按位操作:>>位移运算符
R >>16
B >>8
G >>0
public class Byte_toint {
public static void main(String[] args){
int rgb =8421504;
int red =rgb >>16;
System.out.println("red:"+red);
int green =rgb >>8;
System.out.println("green:"+green);
int blue =rgb >>0;
System.out.println("blue:"+blue);
}
}
只取低八位的数:& | !(与/或/非)
0xFF:低八位全部为1的数
相同保留,不同为1
public class Byte_toint {
public static void main(String[] args){
int rgb =8421504;
int red =rgb >>16;
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);
//这样就把一个Int拆成3个byte了
}
}
调色板/马赛克等扩展处理实现
package 图形图像ps;
import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;
import java.awt.*;
import javax.swing.* ;
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
*/
@Override
public void paint(Graphics g) {
super.paint(g);
//000 代表黑色 255 255 255白色
Color color =new Color(255,0,255);
g.setColor(color);
g.fillRect(100, 100, 500, 500);
//随机数
Random random =new Random();
random.nextInt(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);
//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;
}
}
//绘制原始图像
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);
}
}
//扩展处理:rbg 配比 灰度处理马赛克
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 grey =(red+green+blue)/3;
Color color1 = new Color(grey,grey,grey);
g.setColor(color1);
g.fillRect(610+i, 100+i,30, 30);
}
}
}
public static void main (String[] args) {
new ImagePad();//显示界面
}
}