将图片处理成黑白图片,是通过对像素上的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;
}