思路:我们知道,每张图片都是由众多的像素点组成,那么我们是不是就可以根据像素点的范围来修改这个图片的像素点的颜色,进而就可以达到修改证件照背景颜色的效果啦!我们可以配合取色器获取颜色的rgb,并修改为想要的颜色。
缺点:即使证件照背景色看起来是一样的,但色素点还是不一样,所以我们获取像素点必须要在一段范围内,修改之后,效果也没有那么好
提示:可以深入学习OpenCV,这样换背景后的照片会更好。
分享一下我使用的很好用的取色器
提取码:hhm1
所以,就可以通过代码修改一些简单的背景色了,代码如下:
package com.able;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
public class ImageBackgroundDemo {
public static void main(String[] args) throws Exception{
//指定的图片路径
FileInputStream dir = new FileInputStream("E:/111.jpg");
//新建一个长度为3的数组,负责保存rgb的值
int[] rgb = new int[3];
//通过ImageIO.read()方法来返回一个BufferedImage对象,可以对图片像素点进行修改
BufferedImage bImage = ImageIO.read(dir);
//获取图片的长宽高
int width = bImage.getWidth();
int height = bImage.getHeight();
int minx = bImage.getMinTileX();
int miny = bImage.getMinTileY();
//遍历图片的所有像素点,并对各个像素点进行判断,是否修改
for (int i = minx; i < width; i++) {
for (int j = miny; j < height; j++) {
int pixel = bImage.getRGB(i, j);
//获取图片的rgb
rgb[0] = (pixel & 0xff0000) >>16;
rgb[1] = (pixel & 0xff00) >>8;
rgb[2] = (pixel & 0xff) ;
//进行判断,如果色素点在指定范围内,则进行下一步修改
if (rgb[0]<110&&rgb[0]>50&& rgb[1]<30&&rgb[1]>10 && rgb[2]<50&&rgb[2]>25) { //修改像素点,0x007ABB是证件照的蓝色背景色
bImage.setRGB(i, j, 0x007ABB);
}
}
}
//输出照片保存在本地
FileOutputStream ops;
try {
ops = new FileOutputStream(new File("E:/2.jpg"));
//这里写入的“jpg”是照片的格式,根据照片后缀有所不同
ImageIO.write(bImage, "jpg", ops);
ops.flush();
ops.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
这样就完成了对图片背景色的修改,但是有太多局限性,可以根据自己需要使用。