# easyposter
**Repository Path**: naiqing/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**: 2
- **Forks**: 7
- **Created**: 2022-01-12
- **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"));
}
}
```