图片简单镜像算法实现
图片简单镜像算法实现

图片镜像的算法逻辑其实很简单:

 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;
    }
Copyright © 2019-2020 2024-04-26 09:37:49