更换证件照背景(简单不稳定)

更换证件照背景(简单不稳定)

某天一个高中同学拜托我帮她改变证件照的背景,但是当时我不会PS,虽然想到了下边这个程序(虽然现在看来是不行的),我因为懒就没有帮助她,现在我来介绍我的程序的解决方式。

程序原理

程序原理:

  • 通过改变图片的像素块的颜色改变图片的背景

  • 图片看似是整个一片,但是其实是由一个个像素块拼接而来的

    整个图片

    色素快

  • 获得一个个像素点的rgb值,然后修改这个值,就完成了背景的修改

实践

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package com.dwx;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;

public class ChangeColor {
public static void main(String[] args) throws FileNotFoundException {
//读取照片
File file = new File("src/main/java/com/dwx/pic.jpg");
//新图片地址
File file1 = new File("src/main/java/newpic.jpg");
FileOutputStream fileOutputStream = new FileOutputStream(file1);
//通过idea的图像功能获取到的图片的背景的RGB颜色
Color colorOld = new Color(253,253,255);
//希望改成的RGB颜色
Color colorNew = new Color(250, 5, 5);
BufferedImage read = null;
try {
read = ImageIO.read(file);
int height = read.getHeight();
int width = read.getWidth();
for (int i=0;i<width;i++){
for(int j=0;j<height;j++){
if (read.getRGB(i,j)==colorOld.getRGB()){
//如果相等就将次点的颜色设置成我们需要的颜色
read.setRGB(i,j,colorNew.getRGB());
}
}
}
//最后 把修改过的RGB再写回去
ImageIO.write(read,"jpg",fileOutputStream);
} catch (IOException e) {
e.printStackTrace();
}


}
}

代码步奏:

  • 读取照片File()
  • 通过Image类的read()方法来读取这个图片中的数据 (假设产生的对象为read)
  • 通过read的getHeight()方法获取图片的高
  • 通过read的getWidth()方法获取图片的宽
  • 通过一个for循环遍历图片的一个个像素点的并通过getRGB()方法获取到像素点的RGB值
  • 如果该店的RGB值和我们想要换掉的值一样,那么通过setRGB()方法来设置该点的颜色
  • 通过ImageIo的write()方法,把更改过得read在创建成一个新的图片

成品:

成品

局限性

很明显这个图片有个白边 有的地方没有被修改

原因:

  • 一个图片的背景不可能是纯色的,每个像素点的RGB可能都不一样
  • 不同颜色之间有一个渐变,渐变是由很多不同的色素快构成的,因此无法改变边缘的颜色不同的问题
Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2015-2023 dwx
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信