关于美颜相机的初步开发

界面: 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 ();
}
}

​

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值