颜色减淡是处理图层的一种混合模式,使用“颜色减淡”混合模式时一般会产生大量的色阶溢出
其中涉及几个概念:
1:基色
2:混合色
3:结果色
我们可以在脑海中幻想 有两张彩纸叠在一起,其中最下面的彩纸就是基层,彩纸的颜色就是基色;上面的一
层彩纸就是混合层,上面彩纸的颜色就是混合色(基色、混合色、结果色实际上是针对像素点的颜色通道来说的);
颜色减淡则是通过降低对比度使基色变亮以反映混合色,由混合色的亮度决定基色的亮度和反差。
其中,颜色减淡的公式为:基色 +(基色×混合色)/(255-混合色)=结果色
该公式针对的是每一个像素的每一个通道(R、G、B 都需要进行对应的计算)
根据公式可以得出:
如果基色为白色(0,0,0),则结果色等于0,为白色;
如果混合色为黑色(255,255,255),此时结果色还是等于基色;
注意:当调换基色和混合色的位置,结果色可能会不相同。
如:以下两个图层,图层1为原图层(基层),图层2也为原图层(混合层);对两个图层进行颜色减淡后,可以得到图3(效果层)的效果:基层如下:
混合层如下:
效果层如下:
核心代码如下:
@Component(value = "colorDodgeFilter")
public class ColorDodgeImageLayerFilter extends AbStractImageLayerFilter {
/**
* log
**/
private static final Log log = LogFactory.getLog(ColorDodgeImageLayerFilter.class);
/**
* 图层之间的像素滤镜
* 公式:基色+(基色×混合色)/(255-混合色)=结果色
* 基色+(基色×混合色)/混合色反相=结果色
*
* @param color1 color1 混合色
* @param color2 color2 基色
* @return new color
*/
@Override
public Color filterColor(Color color1, Color color2) {
int red = 255,green = 255,blue = 255;
if (255 - color1.getRed() != 0) {
red =color2.getRed() + ((color2.getRed() * color1.getRed()) / (255 - color1.getRed()));
}
if (255 - color1.getGreen() != 0) {
green = color2.getGreen() + ((color2.getGreen() * color1.getGreen() )/ (255 - color1.getGreen()));
}
if (255 - color1.getBlue() != 0) {
blue = color2.getBlue() + ((color2.getBlue() * color1.getBlue()) / (255 - color1.getBlue()));
}
return new Color(clampColor(red), clampColor(green),clampColor(blue));
}
}
/**
*
* @param color
* @return
*/
protected int clampColor(int color) {
if (color > 255) {
return 255;
}
if (color < 0) {
return 0;
}
return color;
}