图层颜色减淡算法
图层颜色减淡算法

颜色减淡是处理图层的一种混合模式,使用“颜色减淡”混合模式时一般会产生大量的色阶溢出
其中涉及几个概念:
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;
}
                    
Copyright © 2019-2020 2024-04-23 20:00:34