首先确定一下我们需要实现的效果图

案例图

核心代码如下:

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.Toolkit;
import java.awt.geom.Ellipse2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.net.URL;import javax.imageio.ImageIO;public void drawCouponPosterImage(String host, Long userId, GoodsInfoVO vo,String filePath)  {try {String pngString = vo.getPicUrl().substring(vo.getPicUrl().length() - 3);String savePath = ZshopConstants.UploadFilesConstants.STATICFILESTEMPPATH;String imageName = System.currentTimeMillis() + ".png";if (pngString.equals("png")) {URL url = new URL(vo.getPicUrl());InputStream is = url.openStream();byte[] buffer = new byte[1024];int len = 0;File imageFile = new File(savePath + File.separator + imageName);OutputStream os = new FileOutputStream(imageFile);if (!imageFile.exists()) {imageFile.mkdirs();}while ((len = is.read(buffer)) != -1) {os.write(buffer, 0, len);}os.close();is.close();System.out.println("保存图片");}JSONObject json = new JSONObject();json.put("userId", userId);json.put("goodsId", vo.getGoodsId());// 平台String platPath = host + "/resources/images/invite/taobao.png";if ("tmall".equals(vo.getFrom())) {platPath = host + "/resources/images/invite/tianmao.png";} else if ("jd".equals(vo.getFrom())) {platPath = host + "/resources/images/invite/jd.png";} else if ("pdd".equals(vo.getFrom())) {platPath = host + "/resources/images/invite/pdd.png";}BufferedImage platImage = ImageIO.read(new URL(platPath));// 透明底BufferedImage bg = new BufferedImage(750, 1250, BufferedImage.TYPE_INT_RGB);Graphics2D g = bg.createGraphics();g.setColor(Color.WHITE);g.fillRect(0, 0, 750, 1250);// 填充整个屏幕g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,         RenderingHints.VALUE_ANTIALIAS_ON);                        // 消除画图锯齿g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);  // 消除文字锯齿// 写入商品图Image src = Toolkit.getDefaultToolkit().getImage(new URL(vo.getPicUrl()));BufferedImage goodsImg = BufferedImageBuilder.toBufferedImage(src);if (pngString.equals("png")) {    // png单独处理String strImg = ZshopConstants.UploadFilesConstants.STATICFILESTEMPPATH + File.separator + imageName;goodsImg = ImageIO.read(new File(strImg));}int y = 10;Rectangle rectangle = new Rectangle(10, y, 730, 730);g.drawImage(goodsImg.getScaledInstance(rectangle.width, rectangle.height, Image.SCALE_SMOOTH), rectangle.x, rectangle.y, null);y+=735;// 优惠券背景String couponPath = host + "/resources/images/invite/goodsDetailCoupon.png";BufferedImage couponImg = ImageIO.read(new URL(couponPath));g.drawImage(couponImg.getScaledInstance(730, 158, Image.SCALE_SMOOTH), 10, y+10, 730, 158, null);y+=75;Double price = -1.0;Double rebatePrice = 0.0;try{rebatePrice =  (Double.valueOf(vo.getCommission()) * 0.33);price = Double.valueOf(vo.getPrice()) - rebatePrice;price = new BigDecimal(price).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();     rebatePrice = new BigDecimal(rebatePrice).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();}catch(Exception e){logger.error("计算到手价失败", e);}String couponPrice = vo.getCouponPrice() == null ? "0" : vo.getCouponPrice();String info =vo.getHasCoupon() ? "领" + couponPrice + "元券,下单返"+rebatePrice.toString() + "元" :  "下单返"+rebatePrice.toString() + "元";g.setFont(new Font("Microsoft YaHei", Font.BOLD, 30));g.setColor(new Color(255, 255, 255));g.drawString(info , vo.getHasCoupon() ? 40 : 110, y+15);g.setFont(new Font("Microsoft YaHei", Font.PLAIN, 28));g.setColor(new Color(255, 255, 255));g.drawString("超值好物,买就返现" , 90, y+65);String btnTitle ="长按获取";g.setColor(new Color(255, 255, 255));g.setFont(new Font("Microsoft YaHei", Font.PLAIN, 32));g.drawString(btnTitle, 530, y+25);y+=88;// 写入二维码String prefix = "jd".equals(vo.getFrom()) ? ZshopConstants.JD_PREFIX : "pdd".equals(vo.getFrom()) ? ZshopConstants.PDD_PREFIX : ZshopConstants.TAOBAO_PREFIX;BufferedImage qrcode = QrcodeGenerator.encode( ZshopConstants.MOBILE_HOST + "/#/detail/" + prefix + vo.getGoodsId(), 230, 230);g.drawImage(qrcode, 510, y+5, 230, 230, null);g.setFont(new Font("Microsoft YaHei", Font.PLAIN, 22));g.setColor(Color.gray);g.drawString("长按识别二维码" , 550, y+240);y+=25;// 写入平台图片g.drawImage(platImage.getScaledInstance(52, 28, Image.SCALE_SMOOTH), 15, y+7, 52, 28, null);y+=30;// 写入商品名g.setFont(new Font("Microsoft YaHei", Font.PLAIN, 32));g.setColor(Color.BLACK);String title = vo.getTitle();char[] sc = title.toCharArray();int titleOffsetY = 0;String titleSub = "";int row = 0;int j = 0;for (int i = 0; i < title.length(); i++) {titleSub = title.substring(j, i);int titleSubW = g.getFontMetrics().charsWidth(sc, j, i-j);int len = row >0 ?  450  : 400;if(titleSubW > len){j = i;int ox = row > 0 ? 15 : 75;row++;if( row == 3 && j < title.length()-1  ){titleSub = titleSub.substring(0, titleSub.length()-1)  + "...";}g.drawString(titleSub, ox, y + titleOffsetY );if(row  == 3){break;}else{titleOffsetY += 40;}}}if(row == 0){titleSub = title.substring(j,  title.length());g.drawString(titleSub, 75, y + titleOffsetY );}else if(row == 1 || row == 2){titleSub = title.substring(j,  title.length());g.drawString(titleSub, 10, y + titleOffsetY );}y =y + titleOffsetY + 40;g.setFont(new Font("Microsoft YaHei", Font.PLAIN, 25));g.setColor(Color.gray);g.drawString("商品价格以实际价格为准", 15, y);y+=30;// 到手价背景g.drawRect(15, y +10,90,40);g.setColor(new Color(255, 0, 61));g.fillRect(15, y +10,90,40);// 到手价g.setFont(new Font("Microsoft YaHei", Font.BOLD, 25));g.setColor(Color.white);g.drawString("到手价" , 23, y+38);// 到手价人民币图标g.setFont(new Font("Microsoft YaHei", Font.PLAIN, 36));g.setColor(Color.red);g.drawString("¥" , 125, y+45);// 到手价金额g.setFont(new Font("Microsoft YaHei", Font.BOLD, 60));g.setColor(Color.red);g.drawString(price <0?  vo.getPrice() : price.toString() , 145, y+45);// 原价g.setFont(new Font("Microsoft YaHei", Font.PLAIN, 30));g.setColor(new Color(89, 89, 89));g.drawString("原价: " , 350, y+45);// 原价金额g.setFont(new Font("Microsoft YaHei", Font.PLAIN, 30));g.setColor(new Color(89, 89, 89));g.drawString("¥" + vo.getOrgPrice() , 415, y+45);y+=110;g.setFont(new Font("Microsoft YaHei", Font.PLAIN, 36));g.setColor(Color.gray);g.drawString("花得值", 110, y);g.setFont(new Font("Microsoft YaHei", Font.PLAIN, 25));g.setColor(Color.gray);g.drawString("—— 淘宝、天猫、京东...优惠专享APP", 225, y-5);y+=10;g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);                       // 消除画图锯齿g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);  // 消除文字锯齿g.dispose();ImageIO.write(bg, "jpg", new File(filePath));} catch (IOException e) {logger.error("生成优惠券海报失败", e);}}

注:其中GoodsInfoVO 为商品对象,其中生成二维码的方法可参考另一篇博客 ,地址:https://blog.csdn.net/weixin_38340467/article/details/84784107

核心代码写完之后只要调用一下就好了

@Overridepublic String createCouponPoster(String host, Long userId, GoodsInfoVO vo) throws Exception{String fileUrl = (String)redisUtils.get("couponPoster:u"+userId+"_g"+vo.getGoodsId());if(StringUtil.isBlank(fileUrl)){//生成图片String imagePath = ZshopConstants.UploadFilesConstants.STATICFILESTEMPPATH + System.currentTimeMillis()+".jpg";File file = new File(imagePath);drawCouponPosterImage(host, userId, vo, imagePath);//上传至阿里云JSONObject res = ossService.sendFile(imagePath);if(res.getIntValue(SysCommand.CODE) == 1){fileUrl = res.getString("file")+"?x-oss-process=style/w750";redisUtils.set("couponPoster:u"+userId+"_g"+vo.getGoodsId(), fileUrl, 0);}//删除服务器端文件file.delete();}return fileUrl;}

ZshopContats类:

public class ZshopConstants {/*** 文件上传设置* @author CHARLEY**/public static class UploadFilesConstants{public final static String PDFURLHOST = PropertiesUtil.getProperty("elaon.pdf.win.host");/*** 上传host*/public final static String STATICFILESHOST = PropertiesUtil.getProperty("eloan.upload.host");/*** 静态图片文件资源目录*/public final static String STATICFILESTEMPPATH= PropertiesUtil.getProperty("eloan.upload.folder");/*** 静态pdf文件资源目录*/public final static String PDFFILEPATH = PropertiesUtil.getProperty("eloan.upload.folder-pdf") + DateUtil.dtSimpleYmFormat(new Date());public final static String TEMPLATEPATH = PropertiesUtil.getProperty("eloan.upload.folder");/*** 视频文件上传路径*/public final static String VIDEOFILEPATH= PropertiesUtil.getProperty("eloan.upload.folder") + "/video";}
}

BufferImageBuilder类:

package com.zxtg.zshop.util.image;import java.awt.Graphics;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.HeadlessException;
import java.awt.Image;
import java.awt.Transparency;
import java.awt.image.BufferedImage;import javax.swing.ImageIcon;public class BufferedImageBuilder {public static BufferedImage toBufferedImage(Image image) {if (image instanceof BufferedImage) {return (BufferedImage) image;}// This code ensures that all the pixels in the image are loadedimage = new ImageIcon(image).getImage();BufferedImage bimage = null;GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();try {int transparency = Transparency.OPAQUE;GraphicsDevice gs = ge.getDefaultScreenDevice();GraphicsConfiguration gc = gs.getDefaultConfiguration();bimage = gc.createCompatibleImage(image.getWidth(null),image.getHeight(null), transparency);} catch (HeadlessException e) {// The system does not have a screen}if (bimage == null) {// Create a buffered image using the default color modelint type = BufferedImage.TYPE_INT_RGB;bimage = new BufferedImage(image.getWidth(null),image.getHeight(null), type);}// Copy image to buffered imageGraphics g = bimage.createGraphics();// Paint the image onto the buffered imageg.drawImage(image, 0, 0, null);g.dispose();return bimage;}}

JAVA后端生成类似于分享海报图片的功能的实现相关推荐

  1. java后端生成微信分享图片:使用freemarker、cssbox

    使用freemarker.cssbox生成微信分享图片 1. 生成微信图片我所想的有两种方式 利用图片水印来制作,可以先制作好想要的模板在利用水印将相应的内容添加打相应的位置完成 利用freemark ...

  2. 仿商城商品生成分享海报图片和识别图中二维码并跳转商品详情页

    购物商城里面的商品分享给朋友的时候会生成一张海报图片,图片上附带这二维码图片,朋友拿到这张图片扫描上面的二维码就可以进入商品详情页查看此商品了.今天来做一下这种功能,先生成商品海报图片,然后长按这张图 ...

  3. java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题

    文章目录 先看成品 前言 一.项目目录结构 一.海报制作PosterUtil.java工具类 1. 描述 2. 代码 二.测试生成海报 1. 描述 2. 直接上代码 四.其他测试 1. Test1_C ...

  4. uniapp生成商品分享海报

    uniapp用canvas生成一个分享商品的海报 文章目录 前言 一.展示效果 二.使用步骤 1.HTML部分 2.CSS部分 3.JS部分 总结 前言 uniapp用canvas生成一个分享商品的海 ...

  5. java中生成pdf,插入图片,页眉、页脚、表格

    全栈工程师开发手册 (作者:栾鹏) java教程全解 java中生成pdf,插入图片,页眉.页脚.表格 import com.lowagie.text.*; import com.lowagie.te ...

  6. 电商平台-Java后端生成Token架构与设计详解

    目的:Java开源生鲜电商平台-Java后端生成Token目的是为了用于校验客户端,防止重复提交. 技术选型:用开源的JWT架构. 1.概述:在web项目中,服务端和前端经常需要交互数据,有的时候由于 ...

  7. VUE+Canvas实现输入文字生成对应的字体图片小功能

    你是不是经常浏览字体网站的时候,发现他们的"字体生成器"和预览功能很好奇,为什么输入框输入文字之后,点击预览,下面都会修改对应的字体内容,以便达到了没有安装字体也可以预览这个字体效 ...

  8. JAVA生成微信小程序分享海报图片

    由于小程序里面分享产品,不能直接到朋友圈,因此很多系统的做法是生成一张带有二维码,或者小程序码的海报图片.用户保存到本地,然后分享到朋友圈. 生成海报,有两种方式: 前端小程通过 canvs 绘图到模 ...

  9. [Java生成商品的海报图片 ]

    目录 前言: 生成商品海报图片需要处理两个问题: 依赖: 编写生成海报代码 另一个方法: 补全上面的main测试方法: 前言: 你知道的 这只是一个简单笔记...... 生成商品海报图片需要处理两个问 ...

最新文章

  1. YOLO算法史上最全综述:从YOLOv1到YOLOv5
  2. 深入理解DOM事件类型系列第六篇——加载事件
  3. 【软考-软件设计师】输入/输出技术
  4. 818. Race Car
  5. 启动项 mysql命令大全_mysql常用命令
  6. 表格锁定表头不动_Excel教程:你有没有被表头难过?分享几招搞定(下)
  7. win10远程登陆deepin xrdp
  8. 更改yum源配置后执行报错[Errno 14] PYCURL ERROR 22 - “The requested URL returned error: 404 Not Found”
  9. Bad owner or permissions on .ssh/config win10问题解决
  10. c语言void swap1,C语言的一些遗留问题(1):关于交换两个数的swap()函数的一些问题...
  11. android7.1.2安装包,APK.1文件安装器下载-APK.1安装:微信APK安装器下载1.7 安卓版-西西软件下载...
  12. 【构建基于树莓派cm4的机器人控制系统的运行环境】
  13. 《操作系统真象还原》第十四章 ---- 实现文件系统 任务繁多 饭得一口口吃路得一步步走啊(总结篇)
  14. WPF 绑定继承的样式提示 只能根据带有基类型 IFrameworkInputElement 的目标类型的 Style 样式
  15. WEB前端学习 (3)CSS复习二 ( 复合选择器+元素显示模式+ 背景)
  16. TCP/IP第二章笔记链路层协议
  17. 魏德米勒端子eplan宏_Eplan部件库和宏全集
  18. 一、如何完全卸载Anaconda(如何下载Anaconda-Clean package)
  19. git restore指令和git restore --staged 的使用
  20. 华为OD机试 - 跳房子I(Java JS Python)

热门文章

  1. python读取pdf文档书签 bookmark_用Python为PDF文件批量添加书签
  2. ESB之旅(拉巴士的小骡子)
  3. turtle库制作简单动画和总结
  4. 生物信息学所需的计算机知识,生物信息学专业计算机课程的探讨
  5. 带分数(全排列详解)
  6. 如何为Mac找到最合适的下载器
  7. (离散)证明:单射 满射 同态 同构 的证明框架
  8. oracle 的三个主要内存结构SGA,PGA,UGA
  9. 微信Hook最佳实践-WechatHook
  10. 化学空间对接概念性验证 | Chemical Space Docking