图片镜像的算法逻辑其实很简单:
1:对原图片1复制并进行180度旋转,生成旋转后的图片2;参考:图片旋转算法
2:对旋转后的图片2进行透明度处理,这样会比较像水中的倒影;生成图片3,参考:图片透明度算法
3:对处理透明度后的图片3与旋转后的图片2进行简单垂直合并,生成最终的镜像图片;
原图如下:
效果图如下:
核心代码如下:
@Component(value = "mirrorFilter")
public class MirrorFilter extends AbstractPictureFilter {
/**
* 旋转图片
*/
@Autowired
private PictureFilterInterface revolveFilter;
/**
* 透明度算法
*/
@Autowired
private PictureFilterInterface alphaFilter;
/**
* log
**/
private static final Log log = LogFactory.getLog(MirrorFilter.class);
/**
* 对像素color 进行处理
*
* @param color 原color
* @return 新color
*/
@Override
protected Color filterColor(Color color) {
return null;
}
/**
* 对图片增加滤镜
* 1:镜像图片其实就是把图片进行旋转180度;
* 2:对旋转后的图片进行透明化处理
* 3:将新的图片与原图片进行拼接
*
* @param image 图片
* @return 增加滤镜之后的图片
*/
@Override
public BufferedImage pictureAddFilter(BufferedImage image) {
//首先对图片进行图片进行旋转
BufferedImage revolveImage = revolveFilter.pictureAddFilter(image);
//进行透明
BufferedImage alphaImage = alphaFilter.pictureAddFilter(revolveImage);
//将新的图片与原图片进行拼接
return mergePicture(image,alphaImage);
}
/**
* 垂直合并图片
*
* @param image1 图片1
* @param image2 图片2
* @return
*/
public BufferedImage mergePicture(BufferedImage image1, BufferedImage image2) {
int[] rgb1 = new int[image1.getWidth() * image1.getHeight()];
int[] rgb2 = new int[image2.getWidth() * image2.getHeight()];
rgb1 = image1.getRGB(0, 0, image1.getWidth(), image1.getHeight(), rgb1, 0, image1.getWidth());
rgb2 = image2.getRGB(0, 0, image2.getWidth(), image2.getHeight(), rgb2, 0, image2.getWidth());
BufferedImage newImage = new BufferedImage(
image1.getWidth(),
image1.getHeight() + image2.getHeight(),
BufferedImage.TYPE_4BYTE_ABGR);
newImage.setRGB(0,0,image1.getWidth(),image1.getHeight(),rgb1,0,image1.getWidth());
newImage.setRGB(0,image1.getHeight(),image2.getWidth(),image2.getHeight(),rgb2,0,image2.getWidth());
return newImage;
}