图片黑白滤镜
图片黑白滤镜

将图片处理成黑白图片,是通过对像素上的RGB根据一定的算法生成对应的比例调节来完成的。

而Photoshop 图像黑白调整功能的计算公式为:
gray= (max - mid) * ratio_max + (mid - min) * ratio_max_mid + min
公式中:gray为像素灰度值,max、mid和min分别为图像像素R、G、B分量颜色的最大值、中间值和最小值,ratio_max为max所代表的分量颜色(单色)比率,ratio_max_mid则为max与mid两种分量颜色所形成的复色比率。
该功能的图片黑白滤镜则根据以上公式计算而出。

在Photoshop中,是通过对红、黄、绿、青、蓝和洋红等6种颜色的比例调节来完成的,其中该六种颜色的默认系数值为: red=0.4
yellow=0.6
green =0.4
magenta=0.6
blue=0.2
cyan=0.8

 

原图如下:

效果图如下:

 

核心代码如下:


public BufferedImage pictureAddFilter(BufferedImage image) {

    int width = image.getWidth();
    int height = image.getHeight();
    int minWidth = image.getMinX();
    int minHeight = image.getMinY();

    for (int i = minWidth; i < width; i++) {
        for (int y = minHeight; y < height; y++) {
            int rgb = image.getRGB(i, y);
            Color color = new Color(rgb);
            color = filterColor(color);
            image.setRGB(i,y,color.getRGB());
        }
    }
    //该image 即是最新的image
    return image;
}

protected Color filterColor(Color color) {
        float gray = getGrayColor(color);
        color = new Color((int) gray, (int) gray, (int) gray);
        return color;
}

/**
 * 得到新的灰度值
 *
 * @param color color
 * @return 新的RGB值
 */
public float getGrayColor(Color color) {

    int red = color.getRed();
    int green = color.getGreen();
    int blue = color.getBlue();
    int[] rgbArr = sortRGB(red, green, blue);
    //因为公式中ratioMaxMid 只有两个值:0.6 和0.8,0.6的概率是2/3 ,0.8 的概率是1/3
    //所以ratioMaxMid 初始值为0.6f
    //单色对应的比率为0.4 和0.2,同理单色比率ratioMax 默认值为0.4
    float ratioMax = 0.4f, ratioMaxMid = 0.6f;
    //分量颜色的最大值的最大因子蓝色是0.2,红和黄全是0.4
    if (rgbArr[0] == blue) {
        ratioMax = 0.2f;
        if (rgbArr[1] == red) {
            ratioMaxMid = 0.8f;
        }
    } else if (rgbArr[0] == red) {
        if (rgbArr[1] != green) {
            ratioMaxMid = 0.8f;
        }
    }
    return ((rgbArr[0] - rgbArr[1]) * ratioMax + (rgbArr[1] - rgbArr[2]) * ratioMaxMid + rgbArr[2]);
}

/**
 * 对rgb 三色进行排序
 *
 * @param red   红
 * @param green 绿
 * @param blue  蓝
 * @return arr
 */
public int[] sortRGB(int red, int green, int blue) {

    int[] rgbArr = new int[]{red, green, blue};
    for (int i = 0; i < rgbArr.length; i++) {
        int temp;
        for (int j = i + 1; j < rgbArr.length; j++) {
            if (rgbArr[i] < rgbArr[j]) {
                temp = rgbArr[i];
                rgbArr[i] = rgbArr[j];
                rgbArr[j] = temp;
            }
        }
    }
    return rgbArr;
}
Copyright © 2019-2020 2024-04-25 06:58:16