# easyposter **Repository Path**: jk96/easyposter ## Basic Information - **Project Name**: easyposter - **Description**: No description available - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 7 - **Created**: 2024-09-03 - **Last Updated**: 2024-09-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Easy Poster *保留了部分原项目内容,新的详细使用示例请查看我的博客* https://blog.csdn.net/sywangnaiqing/article/details/122673353 **java的awt绘制海报的简单工具** 一个简单的,便于扩展的绘制海报工具包 ## 前言 > 微信后台生成海报一般都是一个模板写死,然后就完事了,过了不久让修改个模板,就又要看半天,还要考虑是否重新复制一份改一改,越来越多的重复代码,全在一个图片类里,然后就越来越乱。这两天用设计模式处理了一下,让以后修改模板,新增模板更舒服一点。 ## 效果展示 图片过大, 如不显示,请跳转查看 ## 设计思想 - 装饰者模式 - 责任链模式 - 建造者模式(lombok) ## 快速上手 - demo分支可以更好的帮助你理解使用方式 - 看效果请直接运行demo分支里的 PosterTest - 自定义海报请按照demo分支下的content目录下的类对自身业务兼容 - 如果装饰器不满足你的需求, 请对decorators扩展 - 绘制请让设计给出类似蓝湖的像素图, 仿照PosterTest按着填一下就ok - 有简单的注解支持 - 项目仅引入了lombok简化代码(1.0 版本包含有spring core) ## 注解样例 **海报定义类** ```java package com.naiqing.poster.demo; import com.quaint.poster.annotation.PosterBackground; import com.quaint.poster.annotation.PosterFontCss; import com.quaint.poster.annotation.PosterImageCss; import com.quaint.poster.core.abst.AbstractDefaultPoster; import com.quaint.poster.core.dto.PosterBarcode; import lombok.Builder; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Tolerate; import java.awt.*; import java.awt.image.BufferedImage; /** * 〈商品分享海报元素及相关参数定义〉
* * @author naiqing * @Date 2022/1/21 * @see [相关类/方法] * @since [产品/模块版本] */ @EqualsAndHashCode(callSuper = true) @Data @Builder public class CommodityPoster2Pojo extends AbstractDefaultPoster { /** * 背景图 */ @PosterBackground(width = 540, height = 868) private BufferedImage backgroundImage; /** * 商品图 */ @PosterImageCss(position = {0, 0}, width = 540, height = 614) private BufferedImage commodityImage; /** * 严选图标 */ @PosterImageCss(position = {16, 625}, width = 50, height = 28) private BufferedImage yanxuanImage; /** * 商品标题 */ @PosterFontCss(position = {16, 625}, size = 22, canNewLine = {1, 482, 2}, style = Font.BOLD) private String commodityTitle; /** * 特权价 */ @PosterFontCss(position = {16, 706}, size = 20, color = {247, 23, 61}) private String vipPrice; /** * 原价 */ @PosterFontCss(position = {16, 742}, size = 15, color = {51, 51, 51}, delLine = true) private String oldPrice; /** * 头像 */ @PosterImageCss(position = {10, 780}, width = 55, height = 55, circle = true) private BufferedImage headImage; /** * 昵称 */ @PosterFontCss(position = {77, 788}, color = {85, 85, 85}, name = "腾祥爱情体细简", style = Font.BOLD) private String nickName; /** * 昵称下的描述 */ @PosterFontCss(position = {75, 813}, size = 15, color = {104, 104, 104}, name = "腾祥爱情体细简") private String nickDesc; /** * 二维码 */ private PosterBarcode qrCode; /** * 二维码字 */ @PosterFontCss(position = {386, 833}, size = 20, color = {104, 104, 104}, center = true) private String qrCodeText; @Tolerate public CommodityPoster2Pojo() { } } ``` **海报绘制** ```java package com.naiqing.poster.demo; import com.quaint.poster.core.dto.PosterBarcode; import lombok.SneakyThrows; import org.testng.annotations.Test; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.InputStream; /** * 〈测试海报〉
* * @author naiqing * @Date 2022/1/22 * @see [相关类/方法] * @since [产品/模块版本] */ public class CommodityPoster2Test { @SneakyThrows @Test public void testCreate() { //背景图,此处测试我是用的本地图,实际开发可换成网络获取图片(下面有示例) BufferedImage backgroundImage = ImageIO.read(new File("D:\\temp\\s_bg.jpg")); //商品主图 BufferedImage commodityImage = ImageIO.read(new File("D:\\temp\\s_commodity.jpg")); //严选图标 BufferedImage yanxuanImage = ImageIO.read(new File("D:\\temp\\s_yanxuan.jpg")); //头像 BufferedImage headImage = ImageIO.read(new File("D:\\temp\\s_head.jpg")); //二维码logo BufferedImage qrLogo = headImage; //二维码内容 String qrContent = "http://www.baidu.com"; //全局默认字体(如果不将字体库资源引入,在windows下没问题,但linux没有默认的"宋体"会显示乱码) InputStream in1 = this.getClass().getResourceAsStream("/fonts/simkai.ttf"); Font defaultFont = Font.createFont(Font.TRUETYPE_FONT, in1); //昵称显示的字体(此字体库是从网上下载的,非windows自带),使用时引用FontName字体名称即可(字体名称:双击字体库可以看到字体名称) InputStream in2 = this.getClass().getResourceAsStream("/fonts/TTAiQingXiJ_0.ttf"); Font txin2 = Font.createFont(Font.TRUETYPE_FONT, in2); CommodityPoster2Pojo shareCommodityInfo = CommodityPoster2Pojo.builder() .backgroundImage(backgroundImage) .commodityImage(commodityImage) .yanxuanImage(yanxuanImage) .commodityTitle(" 雾中女孩2022冬季新款女装连帽拉链长袖棉服 WH88888") .vipPrice("特权价¥0.01") .oldPrice("售价¥268") .headImage(headImage) .nickName("叫我胡歌啊") .nickDesc("邀请好友享受内部优惠价") .qrCode(PosterBarcode.builder().content(qrContent).logo(qrLogo).build()) .qrCodeText("微信扫一扫") .build(); //创建海报生成器 PosterBarcodeImpl poster = new PosterBarcodeImpl<>(); //设置默认字体库 /安装用到的全部字体库(支持传多个) poster.defaultFont(defaultFont).installFonts(txin2,...); //生成海报 BufferedImage image = poster.annotationDrawPoster(shareCommodityInfo).draw(null); ImageIO.write(image, "png", new File("D:\\temp\\out2.png")); } } ```