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