怎樣將藍底照片換成白底

方法:美圖秀秀 + java程序。java

 

原來的照片是這樣的:數組

 

1. 先用美圖秀秀將面積較大的藍底以及邊緣比較光滑的部分先刷成白色,或者摳出來都行。spa

 

 2. 用java程序將邊緣部分的藍色調替換成白色,代碼以下:code

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. 再用美圖秀秀把周圍未去除的藍色部分刷成白色。blog

 

4. 這樣基本上就完成了,若是不滿意,還能夠用美圖秀秀中的「局部變色筆」,用黑色在頭髮邊緣處刷一刷。圖片

大功告成!!!!get

相關文章
相關標籤/搜索