图层差值算法
图层差值算法

图层差值算法,顾名思义就是将两个图层的RGB 中对应的通道分别进行减法运算,从而可以对比出图层的不同;
也可以使用差值算法,将两张图层融合出新的效果色彩; 因为两个图层的像素点如果相同,进行差值算法之后,为全黑;如果一个图层与另一个透明图层进行差值,则还是原图层的效果。

如:以下两个图层,图层1 其实为原图层,图层2为水印图层;对两个图层进行差值后,可以得到水印的像素点:

图层1如下:

图层2如下:

差值效果如下:

核心代码如下:


@Component(value = "dValueImageLayerFilter")
public class DValueImageLayerFilter extends AbStractImageLayerFilter {

    /**
     * log
     **/
    private static final Log log = LogFactory.getLog(DValueImageLayerFilter.class);

    /**
     * 图层之间的像素滤镜
     *
     * @param color1 color1
     * @param color2 color2
     * @return new color
     */
    @Override
    protected Color filterColor(Color color1, Color color2) {

        return new Color(Math.abs(color1.getRed()-color2.getRed()),
                Math.abs(color1.getGreen() - color2.getGreen()),
                Math.abs(color1.getBlue() - color2.getBlue()));
    }
}
public abstract class AbStractImageLayerFilter implements ImageLayerInterface {

    /**
     * log
     **/
    private static final Log log = LogFactory.getLog(AbStractImageLayerFilter.class);

    /**
     * 两个图层进行操作
     * 要保证两张图片大小致
     * @param image1 图层1
     * @param image2 图层2
     * @return 新的图层
     */
    @Override
    public BufferedImage imageLayerFilter(BufferedImage image1, BufferedImage image2) throws ImageCheckException {
        if(image1.getWidth() != image2.getWidth() || image1.getHeight() != image2.getHeight()){
            throw new ImageCheckException("image1 width or height not equal image2 ");
        }
        int width = image1.getWidth();
        int height = image1.getHeight();
        BufferedImage tranImage = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR);
        for(int i =0;i<width;i++){
            for(int j = 0;j<height;j++){
                int color1 = image1.getRGB(i, j);
                int color2 = image2.getRGB(i, j);
                Color newColor = filterColor(new Color(color1), new Color(color2));
                tranImage.setRGB(i,j,newColor.getRGB());
            }
        }
        return tranImage;
    }

    /**
     * 图层之间的像素滤镜
     * @param color1    color1
     * @param color2    color2
     * @return          new color
     */
    protected abstract Color filterColor(Color color1,Color color2);
}
                    
Copyright © 2019-2020 2024-11-21 17:37:28