Java 图片合成

本文介绍了如何在Java中利用Thumbnailator库进行图片合成,特别是用于生成电子签名或水印。首先引入了Thumbnailator和Apache Commons Lang3的依赖,接着展示了ImageMergeBO类用于存储图片信息,ImageUtil类提供了合成水印的方法。通过测试用例展示了如何将多个水印图片合并到基础图片上,并调整其位置、透明度和旋转角度。
摘要由CSDN通过智能技术生成

在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);
}

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alex·Guangzhou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值