界面:
JFrame
创建一个窗体对象、设置窗体对象的标题 尺寸 关闭选项 可视化
基本数据类型:只能表示单个数据
byte int
二进制:
bit 0 1
一个灯泡只有两种状态: 亮 不亮
两个灯泡有
4
种状态 :
1
不亮
2
不亮
1
亮
2
不亮
1
亮
2
亮
1
不亮
2
亮
1bit:
可以表示
0 1
两个数字
2bit:
可以表示
00 10 01 11 | 0 1 2 3
byte - 8bit
: 有
2^8
次方种排列方式
256
int - 32bit:
可以表示
2^32
个数字
看作 四个
8bit
图像结构:
像素点 数码图像
数码三原色:
Red Green Blue
取值范围:
(0-255)256
阶
使用数字表示每种颜色的值
(
深浅程度
)
黑色:
(0,0,0)
白色:
(255 255 255)
红色:
(255,0,0)
灰色:
R=G=B
将三原色的三个
RGB
数字存储到一个
int
中:
8421504 = 128
,
128
,
128
byte1 = 128 1000 0000
byte2 = 128 1000 0000
byte3 = 128 1000 0000
int rgb = 8421504 : 0000 0000 1000 0000 1000 0000 1000 0000 RED Green Blue
一个
int
的二进制码: 其中
0-7
表示蓝色
8-15
表示绿色
16-23
表示红色
随机生成马赛克图
package
com09.imagepro.v10913
;
import
javax.swing.
JFrame;
import
java.awt.*;
import
java.util.
Random;
public class ImageProUI extends JFrame{
public void showUI(){
setTitle ("马赛克图");
setSize (1200, 700);
setDefaultCloseOperation (EXIT_ON_CLOSE);
setVisible (true);
}
@Override
public void paint(Graphics g){
super.paint (g);
// g
// 随机生成像素
Random random = new Random ();
int[][] pixArray = 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 rgb = (red << 16) + (green << 8) + blue;
pixArray[i][j] = rgb;
}
}
// 绘制
for(int i = 0; i < 500; i++){
for(int j = 0; j < 500; j++){
// 取出像素值
int rgb = pixArray[i][j];
// 拆出 r g b 三原色
int red = (rgb >> 16) & 255;
int green = (rgb >> 8) & 255;
int blue = (rgb >> 0) & 255;
// 设置成颜色对象
Color color = new Color (red, green, blue);
// 设置颜色对象给画笔 g
g.setColor (color);
// 绘制像素矩形
g.fillRect (20 + i, 100 + j, 1, 1);
}
}
}
public static void main(String[] args){
ImageProUI ip = new ImageProUI ();
ip.showUI ();
}
}
如果要生成马赛克效果 则是把循环的i j++变成+=10
并且在绘制的时候把绘制的大小也设置成10,10
给生成的马赛克图添加灰度
for(int i = 0; i < 500; i+=10){
for(int j = 0; j < 500; j+=10){
int rgb = pixArray[i][j];
int red = (rgb >> 16) & 255;
int green = (rgb >> 8) & 255;
int blue = (rgb >> 0) & 255;
int gray = (red+green+blue)/3;
// red == green == blue 就是灰色
Color color = new Color (gray, gray, gray);
g.setColor (color);
g.fillRect (550 + i, 100 + j, 10, 10);
}
}
实现图片滤镜效果:
package
com09.imagepro.v2zyf0917
;
import
javax.imageio.
ImageIO;
import
javax.swing.*;
import
java.awt.*;
import
java.awt.image.
BufferedImage;
import
java.io.
File;
import
java.io.
FileReader;
import
java.io.
IOException;
import
java.nio.
Buffer;
public class ImageProUI extends JFrame{
public void showUI(){
setTitle ("图像处理v2.0");
setSize (2000, 1100);
setDefaultCloseOperation (EXIT_ON_CLOSE);
setVisible (true);
}
@Override
public void paint(Graphics g){
super.paint (g);
int[][] imgArr = getImagePixs ("C:\\Users\\ZLYLF\\Desktop\\img0917_2.jpg");
int w = imgArr.length;
int h = imgArr[0].length;
//原图
for(int i = 0; i < w; i++){
for(int j = 0; j < h; j++){
int rgb = imgArr[i][j];
Color color = new Color (rgb);
g.setColor (color);
g.fillRect (100 + i, 80 + j, 1, 1);
}
}
// 马赛克
for(int i = 0; i < w; i += 10){
for(int j = 0; j < h; j += 10){
int rgb = imgArr[i][j];
Color color = new Color (rgb);
g.setColor (color);
g.fillRect (900 + i, 30 + j, 10, 10);
}
}
// 灰度
for(int i = 0; i < w; i += 1){
for(int j = 0; j < h; j += 1){
int rgb = imgArr[i][j];
Color color = new Color (rgb);
int red = color.getRed ();
int green = color.getGreen ();
int blue = color.getBlue ();
int gray = (int) (red * 0.30 + green * 0.59 + blue * 0.11);
Color color1 = new Color (gray, gray, gray);
g.setColor (color1);
g.fillRect (900 + i, 30 + j, 1, 1);
}
}
// 二值化
for(int i = 0; i < w; i += 1){
for(int j = 0; j < h; j += 1){
int rgb = imgArr[i][j];
Color color = new Color (rgb);
int red = color.getRed ();
int green = color.getGreen ();
int blue = color.getBlue ();
int gray = (int) (red * 0.30 + green * 0.59 + blue * 0.11);
if(gray < 100){
g.setColor (Color.BLACK);
} else{
g.setColor (Color.WHITE);
}
g.fillRect (900 + i, 30 + j, 1, 1);
}
}
// 反片
for(int i = 0; i < w; i += 1){
for(int j = 0; j < h; j += 1){
int rgb = imgArr[i][j];
Color color = new Color (rgb);
int red = color.getRed ();
int green = color.getGreen ();
int blue = color.getBlue ();
Color color1 = new Color (255 - red, 255 - green, 255 - blue);
g.setColor (color1);
g.fillRect (900 + i, 30 + j, 1, 1);
}
}
反片
for(int i = 0; i < w; i += 1){
for(int j = 0; j < h; j += 1){
int rgb = imgArr[i][j];
Color color = new Color (rgb);
int red = color.getRed ();
int green = color.getGreen ();
int blue = color.getBlue ();
int yred = red + 30;
if(yred > 255){
yred = 255;
}
int ygreen = green + 30;
if(ygreen > 255){
ygreen = 255;
}
Color color1 = new Color (yred, ygreen, 255 - blue);
g.setColor (color1);
g.fillRect (900 + i, 30 + j, 1, 1);
}
}
}
// 读取图片的像素
public int[][] getImagePixs(String imagePath){
// File BufferedImage ImageIO
// 根据传入的参数路径 创建一个File对象
File file = new File (imagePath);
// 创建一个BufferedImage 对象变量名 ,切记不要创建对象
BufferedImage buffImg = null;
//使用ImageIO 直接调用read方法 读取File对象
// 将读取的返回值数据对象存入buffimg中
try {
buffImg = ImageIO.read (file);
// 异常处理机制: 程序运行时可能会遇到一些特殊情况
} catch (IOException e) {
throw new RuntimeException (e);
}
// 获取buffImg的宽高 创建一个空的二维数组
int width = buffImg.getWidth ();
int height = buffImg.getHeight ();
int[][] imgArr = new int[width][height];
// 双重循环遍历 将buffImg中的像素值取出来存入数组中
for(int i = 0; i < width; i++){
for(int j = 0; j < height; j++){
imgArr[i][j] = buffImg.getRGB (i, j);
}
}
return imgArr;
}
public static void main(String[] args){
ImageProUI imageProUI = new ImageProUI ();
imageProUI.showUI ();
}
}