Java 图片合成

在web应用开发,有时候会遇到图片合成的场景,比如生成某某申请表时要合成电子签名、某某签章等水印。下面简单介绍一种图片合成工具。
Thumbnailator是一个用来生成图像缩略图的 Java类库,也可以用来进行图片合成。

1、依赖引入

<dependency>
    <groupId>net.coobird</groupId>
    <artifactId>thumbnailator</artifactId>
    <version>0.4.8</version>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.4</version>
</dependency>

2、图片合成类

public class ImageMergeBO {

    /**
     * 图片路径
     * 如:C:\Users\admin\Desktop\TestHtmlToImage\合成图片测试\测试.jpg
     */
    private String imagePath;

    /**
     * 图片链接
     * 如:https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1206117212,1463632427&fm=26&gp=0.jpg
     */
    private String imageUrl;

    /**
     * 缩放比例
     */
    private float scale;

    /**
     * 宽度
     */
    private int width;

    /**
     * 高度
     */
    private int height;

    /**
     * 角度
     */
    private float rotate;

    /**
     * 图片位置x
     */
    private int xPosition;

    /**
     * 图片位置y
     */
    private int yPosition;

    /**
     * 透明度
     */
    private float opacity;

    public String getImagePath() {
        return imagePath;
    }

    public void setImagePath(String imagePath) {
        this.imagePath = imagePath;
    }

    public String getImageUrl() {
        return imageUrl;
    }

    public void setImageUrl(String imageUrl) {
        this.imageUrl = imageUrl;
    }

    public float getScale() {
        return scale;
    }

    public void setScale(float scale) {
        this.scale = scale;
    }

    public int getWidth() {
        return width;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public float getRotate() {
        return rotate;
    }

    public void setRotate(float rotate) {
        this.rotate = rotate;
    }

    public int getxPosition() {
        return xPosition;
    }

    public void setxPosition(int xPosition) {
        this.xPosition = xPosition;
    }

    public int getyPosition() {
        return yPosition;
    }

    public void setyPosition(int yPosition) {
        this.yPosition = yPosition;
    }

    public float getOpacity() {
        return opacity;
    }

    public void setOpacity(float opacity) {
        this.opacity = opacity;
    }
}

3、图片工具类

package com.xmotor.test_thumbnails;

import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Coordinate;
import org.apache.commons.lang3.StringUtils;

import java.awt.image.BufferedImage;
import java.net.URL;
import java.util.Arrays;
import java.util.List;

public class ImageUtil {

    /**
     * 合成水印
     * @param baseImagePath 基础图片路径
     * @param baseImageUrl 基础图片url
     * @param imageMergeBOs 水印图列表
     * @throws Exception
     */
    public static void mergeWatermark(String baseImagePath, String baseImageUrl, ImageMergeBO... imageMergeBOs) throws Exception {
        ImageMergeBO baseImage = new ImageMergeBO();
        baseImage.setImagePath(baseImagePath);
        baseImage.setImageUrl(baseImageUrl);
        baseImage.setScale(1.0f);

        List<ImageMergeBO> imageMergeBOList = Arrays.asList(imageMergeBOs);
        mergeWatermark(baseImage,imageMergeBOList,baseImagePath);
    }

    /**
     * 合成水印
     * @param baseImage 基础图片
     * @param watermarkList 水印图列表
     * @param outputPath 输出路径
     */
    public static void mergeWatermark(ImageMergeBO baseImage, List<ImageMergeBO> watermarkList, String outputPath) throws Exception {

        //获得基础图片
        Thumbnails.Builder base = getThumbnailsBuilder(baseImage);

        for (ImageMergeBO watermarkImage : watermarkList) {
            //获得水印图
            BufferedImage watermark = getThumbnailsBuilder(watermarkImage).asBufferedImage();
            //设置水印位置、透明度
            base.watermark(new Coordinate(watermarkImage.getxPosition(), watermarkImage.getyPosition()), watermark, watermarkImage.getOpacity());
        }
        base.toFile(outputPath);

    }

    private static Thumbnails.Builder getThumbnailsBuilder(ImageMergeBO imageMergeBO)throws Exception{
        Thumbnails.Builder base = null;

        //优先按存放路径,其次按url获取图片
        if (StringUtils.isNotBlank(imageMergeBO.getImagePath())){
            base = Thumbnails.of(imageMergeBO.getImagePath());
        }else if (StringUtils.isNotBlank(imageMergeBO.getImageUrl())){
            base = Thumbnails.of(new URL(imageMergeBO.getImageUrl()));
        }else {
            throw new Exception("Picture not found ...");
        }

        //优先按缩放比例,其次按固定宽高设置图片大小
        if (imageMergeBO.getScale() > 0){
            base.scale(1.0);
        }else{
            base.size(imageMergeBO.getWidth(), imageMergeBO.getHeight());
        }

        //旋转角度
        base.rotate(imageMergeBO.getRotate());
        return base;
    }
}

4、测试

@Test
public void test4() throws Exception{
    ImageMergeBO watermark1 = new ImageMergeBO();
    watermark1.setImagePath("C:\\Users\\admin\\Desktop\\TestHtmlToImage\\合成图片测试\\network_office_center.png");
    watermark1.setRotate(-10);
    watermark1.setScale(1);
    watermark1.setOpacity(1);
    watermark1.setxPosition(100);
    watermark1.setyPosition(100);

    ImageMergeBO watermark2 = new ImageMergeBO();
    watermark2.setImageUrl("https://gimg2.baidu.com/image_search/src=http%3A%2F%2F07imgmini.eastday.com%2Fmobile%2F20190723%2F2019072309_ef8da28a089f447f82b65f747871142b_7872.jpg&refer=http%3A%2F%2F07imgmini.eastday.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1619492350&t=77fd7b18021a5cc1cb44415c9f5b39fd");
    watermark2.setRotate(0);
    watermark2.setScale(0.5f);
    watermark2.setOpacity(1);
    watermark2.setxPosition(300);
    watermark2.setyPosition(300);

    String baseImagePath = "C:\\Users\\admin\\Desktop\\TestHtmlToImage\\合成图片测试\\测试.jpg";
    ImageUtil.mergeWatermark(baseImagePath,null,watermark1,watermark2);
}

在这里插入图片描述


版权声明:本文为weixin_44360895原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。