java 海报三:怎么换行输入文字

直接上代码

一、准备好材料
Integer id = 2;
YxStoreProduct productDTO = storeProductService.selectById(id);
String spreadUrl = "";
Map<String, Object> userMap = new HashMap<>();
userMap.put("name", "张三三");
userMap.put("mobile", "18353120818");
userMap.put("identity", "大达人");
//创建图片
BufferedImage img = null;
Graphics2D g = null;
//是否选择用自己的海报
File newFileT = new File("SourceHanSansCN-Medium.otf");
if (!newFileT.exists()) {
    InputStream streamT = getClass().getClassLoader()
            .getResourceAsStream("SourceHanSansCN-Medium.otf");
    FileUtils.copyInputStreamToFile(streamT, newFileT);
}
Font font = Font.createFont(Font.TRUETYPE_FONT, newFileT);
//生成二维码返回链接
String url = "https://guily-test.oss-cn-qingdao.aliyuncs.com/202108/89_8_H5_product_detail_wap_wechat.jpg";

二、开始合成
//创建图片
img = new BufferedImage(750, 1280, BufferedImage.TYPE_INT_RGB);
//开启画图
g = img.createGraphics();
//背景 -- 读取互联网图片
InputStream stream = getClass().getClassLoader().getResourceAsStream("images/background.png");
ImageInputStream background = ImageIO.createImageInputStream(stream);
BufferedImage back = ImageIO.read(background);

g.drawImage(back.getScaledInstance(750, 1280, Image.SCALE_AREA_AVERAGING), 0, 0, null); // 绘制缩小后的图

//商品  banner图  07-13 读取轮播图第一张
String[] banner = StrUtil.splitToArray(productDTO.getSliderImage(), ",");
BufferedImage priductUrl = null;
try {
    priductUrl = ImageIO.read(new URL(transformStyle(banner[0])));
} catch (IOException e) {
    log.error("creatProductPic 方法异常!商品轮播图:[" + productDTO.getSliderImage() + "]", e);
}
g.drawImage(priductUrl.getScaledInstance(750, 660, Image.SCALE_AREA_AVERAGING), 0, 0, null);

//文案标题
g.setFont(font.deriveFont(Font.BOLD, 40));
g.setColor(new Color(51, 51, 51));
int fontlenb = getWatermarkLength(productDTO.getProductName(), g);
log.error("====="+fontlenb);
//文字长度相对于图片宽度应该有多少行
int lineb = fontlenb / (back.getWidth() - 100);
log.error("===lineb==="+lineb);
//高度
log.error("===="+back.getHeight());
int yb = back.getHeight() - (lineb + 1) * 20 - 560;
//文字叠加,自动换行叠加
int tempXb = 51;
int tempYb = yb;
//单字符长度
int tempCharLenb = 0;
//单行字符总长度临时计算
int tempLineLenb = 0;
StringBuffer sbb = new StringBuffer();
for (int i = 0; i < productDTO.getProductName().length(); i++) {
    char tempChar = productDTO.getProductName().charAt(i);
    tempCharLenb = getCharLen(tempChar, g);
    tempLineLenb += tempCharLenb;
    if (tempLineLenb >= (back.getWidth() - 100)) {
        //长度已经满一行,进行文字叠加
        g.drawString(sbb.toString(), tempXb, tempYb + 50);
        //清空内容,重新追加
        sbb.delete(0, sbb.length());
        //每行文字间距40
        tempYb += 40;
        tempLineLenb = 0;
    }
    //追加字符
    sbb.append(tempChar);
}
g.drawString(sbb.toString(), tempXb, tempYb + 50);

//------------------------------------------------文案-----------------------
//文案
String info = productDTO.getProductInfo();
if (info.length() > 50) {
    info = productDTO.getProductInfo().substring(0, 50) + "...";
}
g.setFont(font.deriveFont(Font.PLAIN, 28));
g.setColor(new Color(51, 51, 51));
fontlenb = getWatermarkLength(info, g);
//文字长度相对于图片宽度应该有多少行
lineb = fontlenb / (back.getWidth() - 100);
log.error("===lineb==="+lineb);
//高度
log.error("===="+back.getHeight());
yb = back.getHeight() - (lineb + 1) * 20 - 460;
//文字叠加,自动换行叠加
tempXb = 51;
tempYb = yb;
//单字符长度
tempCharLenb = 0;
//单行字符总长度临时计算
tempLineLenb = 0;
sbb = new StringBuffer();
for (int i = 0; i < info.length(); i++) {
    char tempChar = info.charAt(i);
    tempCharLenb = getCharLen(tempChar, g);
    tempLineLenb += tempCharLenb;
    if (tempLineLenb >= (back.getWidth() - 100)) {
        //长度已经满一行,进行文字叠加
        g.drawString(sbb.toString(), tempXb, tempYb + 50);
        //清空内容,重新追加
        sbb.delete(0, sbb.length());
        //每行文字间距40
        tempYb += 40;
        tempLineLenb = 0;
    }
    //追加字符
    sbb.append(tempChar);
}
g.drawString(sbb.toString(), tempXb, tempYb + 50);

//logo
BufferedImage logo = null;
InputStream logoStream = getClass().getClassLoader().getResourceAsStream("images/logo.png");
try {
    ImageInputStream logoInputStream = ImageIO.createImageInputStream(logoStream);
    logo = ImageIO.read(logoInputStream);
} catch (IOException e) {
    log.error("creatProductPic 方法异常!logo图", e);
}
// 绘制缩小后的图
g.drawImage(logo.getScaledInstance(218, 64, Image.SCALE_AREA_AVERAGING), 51, 41, null);

//限时抢购背景图
BufferedImage bground = null;
InputStream bgStream = getClass().getClassLoader().getResourceAsStream("images/flash_sale.png");
try {
    ImageInputStream bgInputStream = ImageIO.createImageInputStream(bgStream);
    bground = ImageIO.read(bgInputStream);
} catch (IOException e) {
    log.error("creatProductPic 方法异常!限时抢购背景图", e);
}
// 绘制缩小后的图
g.drawImage(bground.getScaledInstance(140, 40, Image.SCALE_AREA_AVERAGING), 51, 587, null);

//中间分割线
g.setColor(new Color(245,245,245));
g.fillRect(0,930,750,20);

//限时促销价
g.setFont(font.deriveFont(Font.PLAIN, 24));
g.setColor(new Color(51, 51, 51));
g.drawString("限时促销价", 51, 1010);

//促销价
g.setFont(font.deriveFont(Font.PLAIN, 28));
g.setColor(new Color(250, 50, 80));
g.drawString("¥" + productDTO.getPrice(), 50, 1050);

//门店价
g.setFont(font.deriveFont(Font.PLAIN, 22));
g.setColor(new Color(102, 102, 102));
String price = "门店价:¥" + productDTO.getOtPrice();
g.drawString(price, 191, 1048);
g.drawLine(191, 1040, 191 + 160, 1040);

//生成二维码返回链接
BufferedImage qrCode = null;
try {
    qrCode = ImageIO.read(new URL(url));
} catch (IOException e) {
    log.error("creatProductPic 方法异常!url:[" + url + "]", e);
}
// 绘制缩小后的图
g.drawImage(qrCode.getScaledInstance(145, 145, Image.SCALE_AREA_AVERAGING), 554, 970, null);

//二维码字体
g.setFont(font.deriveFont(Font.PLAIN, 24));
g.setColor(new Color(102, 102, 102));
//绘制文字
g.drawString("长按或扫描二维码查看", 51, 1091);

//箭头
BufferedImage arrow = null;
InputStream arrowStream = getClass().getClassLoader().getResourceAsStream("images/arrow.png");
try {
    ImageInputStream red = ImageIO.createImageInputStream(arrowStream);
    arrow = ImageIO.read(red);
} catch (IOException e) {
    log.error("creatProductPic 方法异常!限时抢购背景图", e);
}
// 绘制缩小后的图
g.drawImage(arrow.getScaledInstance(34, 20, Image.SCALE_AREA_AVERAGING), 305, 1072, null);

//底部背景图
BufferedImage icon = null;
InputStream iconStream = getClass().getClassLoader().getResourceAsStream("images/icon.png");
try {
    ImageInputStream icons = ImageIO.createImageInputStream(iconStream);
    icon = ImageIO.read(icons);
} catch (IOException e) {
    log.error("creatProductPic 方法异常!底部背景图", e);
}
// 绘制缩小后的图
g.drawImage(icon.getScaledInstance(750, 148, Image.SCALE_AREA_AVERAGING), 0, 1132, null);

//名称
String name = userMap.get("name").toString();
if (name.length() > 8) {
    name = name.substring(0, 8) + "...";
}
g.setFont(font.deriveFont(Font.PLAIN, 28));
g.setColor(new Color(255, 255, 255));
//绘制文字
g.drawString("来自好友「" + name + "」的分享", 51, 1189);

//身份
g.setFont(font.deriveFont(Font.PLAIN, 24));
g.setColor(new Color(255, 255, 255));
//绘制文字
g.drawString(userMap.get("identity").toString(), 51, 1234);

//手机号
g.setFont(font.deriveFont(Font.PLAIN, 24));
g.setColor(new Color(255, 255, 255));
//绘制文字
g.drawString("手机号:" + userMap.get("mobile").toString(), 130, 1234);
三、最后在本地输出,查看效果
g.dispose();
//先将画好的海报写到本地
String spreadPicPath = "E:\\java\\test.png";
File file = new File(spreadPicPath);
try {
    ImageIO.write(img, "jpg", file);
} catch (IOException e) {
    log.error("creatProductPic 方法异常!写到本地文件:[" + spreadPicPath + "]", e);
}
四、最终效果

在这里插入图片描述

五、用到的其他方法
/**
 * 获取水印文字总长度
 *
 * @paramwaterMarkContent水印的文字
 * @paramg
 * @return水印文字总长度
 */
public static int getWatermarkLength(String waterMarkContent, Graphics g) {
    return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
}
public static int getCharLen(char c, Graphics g) {
    return g.getFontMetrics(g.getFont()).charWidth(c);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值