查看原文
其他

ImageCombiner:一个专门用于服务端图片合成的开源项目!

小胡 爱编程爱技术 2023-12-13

ImageCombiner 介绍

ImageCombiner 是一个专门用于 Java 服务端图片合成的工具,没有很复杂的功能,简单实用,从实际业务场景出发,提供简单的接口,几行代码即可实现图片拼合(当然用于合成水印也可以),素材上支持图片、文本、矩形三种,支持定位、缩放、旋转、圆角、透明度、颜色、字体、字号、删除线、居中绘制、文本自动换行等特性,足够覆盖图片合成的日常需求。

先看一下效果

版本说明

项目完全基于JDK本身编写,不依赖任何框架,没有各种花里胡哨的东西,性能相当不错。

安装字体

注意:合成图片若包含文字的话,开发机和服务器要先安装相应的字体,否则看不出效果,默认使用的字体为 阿里巴巴普惠体(见项目的font目录)。
PS:一些小伙伴反应安装了字体后仍然看不出效果,这多数是因为实际的字体名称跟你看到的文件名是不一样的,可以跑一下测试项目里的showFonts()方法,打印出系统可用字体列表,找一找你刚安装的字体的真实的名字。
添加Maven依赖
<dependency> <groupId>com.freewayso</groupId> <artifactId>image-combiner</artifactId> <version>2.6.5</version></dependency>

ImageCombiner 使用方法

ImageCombiner 使用起来相当简单,主要的类只用一个,new 一个 ImageCombiner对象,指定背景图片和输出格式,然后加入各种素材元素,设置元素的位置、大小和效果(如圆角、颜色、透明度等),调用combine()方法即可。combine()方法直接返回BufferedImage对象,也可以调用getCombinedImageStream()获得流,方便上传oss等后续操作,或者调用save()方法保存到本地,调试的时候比较方便。

代码示例

import com.freewayso.image.combiner.ImageCombiner;import com.freewayso.image.combiner.element.TextElement;import com.freewayso.image.combiner.enums.OutputFormat;import com.freewayso.image.combiner.enums.ZoomMode;
import javax.imageio.ImageIO;import java.awt.*;import java.awt.image.BufferedImage;import java.net.URL;
public class AppTest {
/** * 完整功能测试 * * @throws Exception */ public static void main(String[] args) throws Exception { String bgImageUrl = "https://img.thebeastshop.com/combine_image/funny_topic/resource/bg_3x4.png"; //背景图(测试url形式) String qrCodeUrl = "http://imgtest.thebeastshop.com/file/combine_image/qrcodef3d132b46b474fe7a9cc6e76a511dfd5.jpg"; //二维码 String productImageUrl = "https://img.thebeastshop.com/combine_image/funny_topic/resource/product_3x4.png"; //商品图 BufferedImage waterMark = ImageIO.read(new URL("https://img.thebeastshop.com/combine_image/funny_topic/resource/water_mark.png")); //水印图(测试BufferedImage形式) BufferedImage avatar = ImageIO.read(new URL("https://img.thebeastshop.com/member/privilege/level-icon/level-three.jpg")); //头像 String title = "# 最爱的家居"; //标题文本 String content = "苏格拉底说:“如果没有那个桌子,可能就没有那个水壶”"; //内容文本
//合成器和背景图(整个图片的宽高和相关计算依赖于背景图,所以背景图的大小是个基准) ImageCombiner combiner = new ImageCombiner(bgImageUrl, OutputFormat.PNG); combiner.setBackgroundBlur(30); //设置背景高斯模糊(毛玻璃效果) combiner.setCanvasRoundCorner(100); //设置整图圆角(输出格式必须为PNG)
//商品图(设置坐标、宽高和缩放模式,若按宽度缩放,则高度按比例自动计算) combiner.addImageElement(productImageUrl, 0, 160, 837, 0, ZoomMode.Width) .setRoundCorner(46) //设置圆角 .setCenter(true); //居中绘制,会忽略x坐标参数,改为自动计算
//标题(默认字体为“阿里巴巴普惠体”,也可以自己指定字体名称或Font对象) combiner.addTextElement(title, 55, 150, 1400);
//内容(设置文本自动换行,需要指定最大宽度(超出则换行)、最大行数(超出则丢弃)、行高) combiner.addTextElement(content, "微软雅黑", 40, 150, 1480) .setAutoBreakLine(837, 2, 60);
//头像(圆角设置一定的大小,可以把头像变成圆的) combiner.addImageElement(avatar, 200, 1200, 130, 130, ZoomMode.WidthHeight) .setRoundCorner(200) .setBlur(5); //高斯模糊,毛玻璃效果
//水印(设置透明度,0.0~1.0) combiner.addImageElement(waterMark, 630, 1200) .setAlpha(.8f) //透明度,0.0~1.0 .setRotate(15); //旋转,0~360,按中心点旋转
//二维码(强制按指定宽度、高度缩放) combiner.addImageElement(qrCodeUrl, 138, 1707, 186, 186, ZoomMode.WidthHeight);
//元素对象也可以直接new,然后手动加入待绘制列表 TextElement textPrice = new TextElement("¥1290", 40, 600, 1400); textPrice.setStrikeThrough(true); //删除线 combiner.addElement(textPrice); //加入待绘制集合
//动态计算位置 int offsetPrice = textPrice.getX() + textPrice.getWidth() + 10; combiner.addTextElement("¥999", 60, offsetPrice, 1400) .setColor(Color.red);
//执行图片合并 combiner.combine();
//保存文件 combiner.save("d://fullTest.png");
//或者获取流(并上传oss等) //InputStream is = combiner.getCombinedImageStream(); //String url = ossUtil.upload(is); }
}
效果展示

项目开源地址:
https://gitee.com/dromara/image-combiner
官方使用手册:

http://dromara.gitee.io/image-combiner

END

点点关注不迷路

本文发表于公众号【爱编程爱技术

关注我们,阅读更多精彩内容

点击上方关注我们,谢谢支持

往期推荐:

MAS:40k+ stars 开源免费的Windows/Office激活工具
Scrcpy:90k+ Stars 开源免费的手机投屏电脑软件,支持鸿蒙系统!
Tabby:51.3k stars 可无限定制的跨平台终端工具
Tldraw:21.5k stars 开源的手绘风格画图工具!
Quill:37k+ stars 一款API驱动的富文本编辑器!
dbeaver:34k+ Stars 开源数据库管理工具,吊打Navicat!
Frp:70k+ Stars!简单、高效的内网穿透工具
44.3k Stars霸榜Github:可视化算法代码的交互式平台


继续滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存