方法:美图秀秀 + java程序。
原来的照片是这样的:
1. 先用美图秀秀将面积较大的蓝底以及边缘比较光滑的部分先刷成白色,或者抠出来都行。
2. 用java程序将边缘部分的蓝色调替换成白色,代码如下:
import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import javax.imageio.ImageIO; public class ImageProcessor { public static void main(String[] args) throws Exception { File file = new File("xxx.jpg"); //要处理的图片路径 //定义一个RGB的数组,因为图片的RGB模式是由三个 0-255来表示的 比如白色就是(255,255,255) int[] rgb = new int[3]; BufferedImage bi = null; //用来处理图片的缓冲流 try { bi = ImageIO.read(file); //用ImageIO将图片读入到缓冲中 } catch (Exception e) { e.printStackTrace(); } //得到图片的长宽 int width = bi.getWidth(); int height = bi.getHeight(); /** * 以下是遍历图片的像素,把指定区域内的像素的颜色换成目标颜色 */ //指定每个区域的范围(x:beginX~endX, y:beginY~endY 围起来的区域) int[] beginX = new int[]{230, 230, 1050}; int[] endX = new int[]{1130, 325, 1130}; int[] beginY = new int[]{0, 400, 400}; int[] endY = new int[]{400, 655, 685}; for (int k = 0; k < beginX.length; k++) { for (int i = beginX[k]; i < endX[k]; i++) { for (int j = beginY[k]; j < endY[k]; j++) { //得到指定像素(i,j)上的RGB值 int pixel = bi.getRGB(i, j); //分别进行位操作得到 r g b上的值 rgb[0] = (pixel & 0xff0000) >> 16; rgb[1] = (pixel & 0xff00) >> 8; rgb[2] = (pixel & 0xff); //进行换色操作,我这里是要把蓝底换成白底,那么就判断图片中rgb值是否在蓝色范围的像素 if (rgb[0] < 155 && rgb[0] > 0 && rgb[1] < 256 && rgb[1] > 105 && rgb[2] < 256 && rgb[2] > 105) { bi.setRGB(i, j, 0xffffff); //是则把该像素换成白色 } } } } System.out.println(file.getName() + "处理完毕!"); /** * 将缓冲对象保存到新文件中 */ FileOutputStream ops = new FileOutputStream(new File("xxx.jpg")); //生成的新图片路径 ImageIO.write(bi, "jpg", ops); ops.flush(); ops.close(); } }
处理后:
3. 再用美图秀秀把周围未去除的蓝色部分刷成白色。
4. 这样基本上就完成了,如果不满意,还可以用美图秀秀中的“局部变色笔”,用黑色在头发边缘处刷一刷。
大功告成!!!!
时间: 2024-10-13 11:21:13