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