将图片处理成老照片,是通过对像素上的RGB根据一定的算法生成对应的比例调节来完成的。
其中公式算法为:
R_new=0.393*R+0.769*G+0.189*B;
G_new=0.349*R+0.686*G+0.168*B;
B_new=0.272*R+0.534*G+0.131*B;
注意:该算法可能会算出单色大于255,如:
原rgb为:r:225,g:219,b:145 转换后:
新rgb为:r:284,g:253,b:197
此时需要强制赋值为255。
原图如下:
效果图如下:
核心代码如下:
/**
* 对图片增加滤镜
*
* @param image 图片
* @return 增加滤镜之后的图片
*/
@Override
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());
}
}
return image;
}
/**
* 对像素color 进行处理
*
* @param color 原color
* @return 新color
* r:225,g:219,b:145 对该rgb 转换,可得到下面的值
* r:284,g:253,b:197
*
*/
@Override
protected Color filterColor(Color color) {
int r = (int) (color.getRed() * 0.393 + color.getGreen() * 0.769 + color.getBlue() * 0.189);
int g = (int) (color.getRed() * 0.349 + color.getGreen() * 0.686 + color.getBlue() * 0.168);
int b = (int) (color.getRed() * 0.272 + color.getGreen() * 0.534 + color.getBlue() * 0.131);
r = r > 255 ? 255 : r;
g = g > 255 ? 255 : g;
b = b > 255 ? 255 : b;
return new Color(r, g, b);
}