参考博客:https://blog.csdn.net/linhaibing009/article/details/89576594?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

效果图

第一步:生成自定义的二维码

1 导入依赖

  <!-- 二维码 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.2.1</version></dependency><dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.2.1</version></dependency><!-- 二维码 end-->

2 二维码工具类


import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;import javax.imageio.ImageIO;
import javax.swing.filechooser.FileSystemView;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;/***  喷二维码* @Author: zhangYuHui* @Date: 2020/4/21 15:31*/
public class QrCodeUtil {/*** 生成二维码* @param url 参数路径* @param fileName 文件名称* @return*/public static String createQrCode(String url,String fileName) {//生成的地址String path = FileSystemView.getFileSystemView().getHomeDirectory() + File.separator + "testQrcode";try {Map<EncodeHintType, String> hints = new HashMap<>();hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");BitMatrix bitMatrix = new MultiFormatWriter().encode(url, BarcodeFormat.QR_CODE, 220, 220, hints);File file = new File(path, fileName);if (file.exists() || ((file.getParentFile().exists() || file.getParentFile().mkdirs()) && file.createNewFile())) {writeToFile(bitMatrix, "png", file);return file.getPath();}} catch (Exception e) {e.printStackTrace();}return null;}static void writeToFile(BitMatrix matrix, String format, File file) throws IOException {BufferedImage image = toBufferedImage(matrix);if (!ImageIO.write(image, format, file)) {throw new IOException("Could not write an image of format " + format + " to " + file);}}static void writeToStream(BitMatrix matrix, String format, OutputStream stream) throws IOException {BufferedImage image = toBufferedImage(matrix);if (!ImageIO.write(image, format, stream)) {throw new IOException("Could not write an image of format " + format);}}private static final int BLACK = 0xFF000000;private static final int WHITE = 0xFFFFFFFF;/*** 生成内容* @param matrix* @return*/private static BufferedImage toBufferedImage(BitMatrix matrix) {int width = matrix.getWidth();int height = matrix.getHeight();BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);for (int x = 0; x < width; x++) {for (int y = 0; y < height; y++) {image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);}}return image;}}

第二步,生成海报工具类


import com.xcds.shequ.common.constant.Constants;
import com.xcds.shequ.project.promote.entity.GoodsInfoVO;import java.awt.*;
import java.awt.font.TextAttribute;
import java.awt.geom.Ellipse2D;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URL;
import java.util.HashMap;
import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream;/*** 图片生成海报* @Author: zhangYuHui* @Date: 2020/7/1 17:52*/
public class ImgUtils {public static final String IMAGE_SUFFIX = ".png";/*** 合成图片* @param bgImgUrl  背景图(可以自定义背景)* @param headImgUrl 天猫,淘宝,pdd 小图标,* @param goodsInfoVO 商品集合* @return url* @throws IOException*/public static String drawImage(InputStream bgImgUrl,InputStream headImgUrl,GoodsInfoVO goodsInfoVO) throws IOException {int width = 620;int height = 1004;// RGB形式,自定义背景
//        BufferedImage bgBufImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);BufferedImage bgBufImage = ImageIO.read(bgImgUrl);Graphics2D bgBufImageGraphics = bgBufImage.createGraphics();// 设置背景色bgBufImageGraphics.setBackground(Color.WHITE);// 通过使用当前绘图表面的背景色进行填充来清除指定的矩形。// bgBufImageGraphics.clearRect(0, 0, width, height);// 设置画笔,设置Paint属性 ==>设置标题文字bgBufImageGraphics.setPaint(Color.black);Font font = new Font("PingFangSC-Medium", Font.BOLD, 28);bgBufImageGraphics.setFont(font);//商品标题,大于23个子,用点代替String title = goodsInfoVO.getTitle();if(title.length()>22){title=title.substring(0,21)+"...";}bgBufImageGraphics.drawString(title, 70, 80);// 设置卷后价Font font1 = new Font("PingFangSC-Medium", Font.BOLD, 60);bgBufImageGraphics.setPaint(Color.red);bgBufImageGraphics.setFont(font1);bgBufImageGraphics.drawString(goodsInfoVO.getOrgPrice(), 160, 180);//获取上次的文字宽度 + 上一次的x轴+ 隔离距离FontMetrics fm = bgBufImageGraphics.getFontMetrics(font1);int width1 = fm.stringWidth(goodsInfoVO.getOrgPrice())+165;// 设置原价后价HashMap<TextAttribute,Object> hm = new HashMap<>(Constants.MAP_LENG);hm.put(TextAttribute.FAMILY,"PingFangSC-Medium");hm.put(TextAttribute.SIZE, 28);hm.put(TextAttribute.POSTURE, TextAttribute.POSTURE_OBLIQUE);//粗体hm.put(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD);//删除线hm.put(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON);Font font2 = new Font(hm);bgBufImageGraphics.setPaint(Color.lightGray);bgBufImageGraphics.setFont(font2);bgBufImageGraphics.drawString("原价¥"+goodsInfoVO.getPrice(), width1, 180);// 设置购买人数Font font3 = new Font("PingFangSC-Medium", Font.BOLD, 20);bgBufImageGraphics.setPaint(Color.gray);bgBufImageGraphics.setFont(font3);bgBufImageGraphics.drawString(goodsInfoVO.getMonthSales()+" 人已买", 60, 220);// 设置优惠卷金额Font font4 = new Font("PingFangSC-Medium", Font.BOLD, 30);bgBufImageGraphics.setPaint(Color.white);bgBufImageGraphics.setFont(font4);bgBufImageGraphics.drawString("¥"+goodsInfoVO.getCouponPrice(), 580, 190);// 抗锯齿bgBufImageGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// BufferedImage posterBufImage = ImageIO.read(new URL(posterImgUrl));// //直接使用图片做背景,自定义背景使用上面方式// Graphics2D posterBufImageGraphics = posterBufImage.createGraphics();//商品图片BufferedImage posterBufImage = ImageIO.read(new URL(goodsInfoVO.getPicUrl()));//读取本地图片 二维码BufferedImage qrCodeImage = ImageIO.read(new FileInputStream(goodsInfoVO.getQrCodeImgUrl()));//标识图片,天猫BufferedImage headImage = ImageIO.read(headImgUrl);// 设置圆形图片BufferedImage roundHeadImg = new BufferedImage(headImage.getWidth(), headImage.getHeight(),BufferedImage.TYPE_INT_RGB);Graphics2D roundHeadGraphics = roundHeadImg.createGraphics();Ellipse2D.Double shape = new Ellipse2D.Double(0, 0, roundHeadImg.getWidth(), roundHeadImg.getHeight());roundHeadGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);roundHeadImg = roundHeadGraphics.getDeviceConfiguration().createCompatibleImage(headImage.getWidth(),headImage.getHeight(), Transparency.TRANSLUCENT);roundHeadGraphics = roundHeadImg.createGraphics();// 使用 setRenderingHint 设置抗锯齿roundHeadGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);roundHeadGraphics.setClip(shape);roundHeadGraphics.drawImage(headImage, 0, 0, null);roundHeadGraphics.dispose();// bgBufImageGraphics.drawImage(qrCodeImage, (posterBufImage.getWidth()// - qrCodeImage.getWidth()), 10, qrCodeImage.getWidth(),// qrCodeImage.getHeight(), null);// posterBufImageGraphics.drawImage(roundHeadImg, 50, 100,// HEAD_URL_WIDTH, HEAD_URL_HEIGHT, null);//二维码bgBufImageGraphics.drawImage(qrCodeImage, 520, 970, 220, 210, null);//天猫图片bgBufImageGraphics.drawImage(roundHeadImg, 32, 45, 30, 30, null);//商品图片bgBufImageGraphics.drawImage(posterBufImage, 32, 250, 680, 680, null);bgBufImageGraphics.dispose();ByteArrayOutputStream bs = new ByteArrayOutputStream();ImageOutputStream imgOut = ImageIO.createImageOutputStream(bs);ImageIO.write(bgBufImage, "png", imgOut);// 上传到服务器上String url = QiniuCloudUtil.uploadObject2OSS(bs.toByteArray());//字节写入到本地//QiniuCloudUtil.uploadImgLocalHost(bs.toByteArray());return url;}}

3 接收参数的实体

package com.xcds.shequ.project.promote.entity;import lombok.Data;/*** @Author: zhangYuHui* @Date: 2020/7/1 17:56*/
@Data
public class GoodsInfoVO {/**商品id*/private String id;/**用户渠道id*/private String rid;/**标题*/private String title;/**商品图片*/private String picUrl;/**标识,tm 天猫,tb 淘宝,pdd 拼多多*/private String from;/**原价*/private String price;/**卷后价*/private String orgPrice;/**售量*/private String monthSales;/**优惠卷价格*/private String couponPrice;/**二维码图片*/private String qrCodeImgUrl;}

4调用方法

 /*** 生成海报* @param goodsInfoVO* @return*/@GetMapping("poster")public AjaxResult poster(GoodsInfoVO goodsInfoVO) throws IOException {SysUser user = getUser();if(StringUtils.isNotEmpty(user.getRelationId())){//生成二维码String qrCode = QrCodeUtil.createQrCode("www.baidu.com", "temp.jpg");InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("static/app/imgs/"+goodsInfoVO.getFrom()+".png");InputStream bgImg = this.getClass().getClassLoader().getResourceAsStream("static/app/imgs/bg.png");goodsInfoVO.setQrCodeImgUrl(qrCode);String url = ImgUtils.drawImage(bgImg,inputStream,goodsInfoVO);System.out.println("二维码:"+qrCode+"清除:"+ FileUtils.deleteFile(qrCode));//成功之后,删除临时二维码文件return AjaxResult.success(url);}return AjaxResult.error("请绑定渠道");}

注意:这个只是小图标和背景图,

背景图片,相当于填空题一样,把对应的参数填入到指定的地方

postman测试

部署到linux 环境图片文字可能会乱码,需要linux安装正确的字体,参考博客https://blog.csdn.net/weixin_30292745/article/details/98614816?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

底图加平方字体下载

链接:https://pan.baidu.com/s/1VzfC-7aR079m8SJQ64worQ 
提取码:oais

java 分享商品生成海报到微信+二维码相关推荐

  1. Java如何解析个人或他人微信二维码内的信息

    这两天对微信二维码比较感兴趣,所以就花了点时间学习了一下,下面我将先介绍一下如何解析微信二维码内的信息. 直接上代码: import java.awt.image.BufferedImage; imp ...

  2. java利用qrcode生成带有logo的二维码(logo位置及大小自己调)

    一:下载Qrcode.jar,放到lib文件夹下 二:java代码 package com.test; import java.awt.Color; import java.awt.Graphics2 ...

  3. 微信公众平台开发(121) 微信二维码海报

    关键字:微信公众平台 二维码 海报 作者:方倍工作室 原文: http://www.cnblogs.com/txw1958/p/weixin-poster.html 本文介绍微信公众平台下二维码海报的 ...

  4. 微信活码管理系统微信二维码活码工具微信群营销推广源码

    微信活码管理系统是一种能够帮助企业进行微信营销推广的工具.通过该系统,企业可以更加高效地管理和利用微信二维码来进行群营销推广.下面我们来介绍一下微信活码管理系统的功能和优势. 首先,微信活码管理系统提 ...

  5. 分享商品生成海报的需求技术点总结

    分享商品生成海报的需求技术点总结 需求描述 商品详情页中,点击分享按钮,能生成一张可以保存到手机的商品海报图片,让用户保存到手机之后,可以通过微信或者别的聊天工具,发送这张图片到聊天中,达到分享的效果 ...

  6. 微信生成带参数的二维码,合成海报,扫码后推送小程序?

    微信服务号渠道二维码功能,支持生成带参数二维码,合成海报二维码,微信扫码后推送内容:结合微号帮平台48小时信息推送,推送微信小程序. 带参二维码 海报二维码 微信扫码后回复 48小时信息推送 在微号帮 ...

  7. 小程序之 保存canvas生成商品图片附加小程序二维码 分享到朋友圈

    小程序之 保存canvas生成商品图片附加小程序二维码 分享到朋友圈 一.概述 需要用到的生成二维码组件(可自行下载添加到小程序根目录utils里):https://github.com/demi52 ...

  8. python制作微信个人二维码_一个python自动生成微信二维码海报的轮子

    由于最近需要做一个线上活动,所以策划了一个微信二维码海报的用户裂变方案.做好了需求以后交给我们可爱的程序媛妹妹.三天过后去问她,她的表情是这样的 她是不是在说,"啊啊,真是不好意思" ...

  9. thinkphp用phpqrcode生成二维码(含中间带logo、临时二维码)或生成微信二维码海报的方法

    前期准备: 1.phpqrcode类文件下载,下载地址:https://sourceforge.net/projects/phpqrcode/ 2.PHP环境必须开启支持GD2扩展库支持(一般情况下都 ...

  10. 微信二维码的生成(java后端)--邀请新人

    目录 写在前言 1.微信官方文档 2.具体分析 写在前言 最近因为在学习微信小程序邀请新用户的功能,所以需要后端生成二维码并且携带本人的用户id或者其他的信息,传给前端.用户通过这个二维码去进行登录或 ...

最新文章

  1. CodeForces - 731D 80-th Level Archeology(线段树+暴力/差分)
  2. SAP CRM WebClient UI的工作中心加载逻辑
  3. asterisk 扩展应用(3)——IVR 实现
  4. 如何提取html的文本,如何从html标签之间提取文本?
  5. 什么是相关性以及为什么需要初始化它?
  6. 濛濛有感——懂与不懂(一)
  7. windows黑窗命令
  8. Excel线性回归分析
  9. 腾讯云服务器搭建鸿蒙Hi3861开发板开发环境
  10. 《数解道法》(一)前言
  11. CPU卡指令返回错误集
  12. 勃林格殷格翰未来五年计划增资中国4.51亿欧元;第127届广交会闭幕 | 美通企业日报...
  13. 在WindowsMobil系统中实现透明树组件
  14. IaaS、 PaaS、SaaS是什么
  15. 用mask-rcnn训练自己的数据
  16. 【输入一个数并判断是质数还是合数】
  17. .netcore向写es日志报错Elasticsearch.Net.UnexpectedElasticsearchClientException:expected:‘{‘,actual:‘<‘
  18. 通信专业应掌握的计算机软件,全国通信专业技术人员职业水平(中级)考试大纲...
  19. cesium 加载热力图
  20. 调音台docker教程_Docker超详细教程

热门文章

  1. 用于专利申请的创新提案模板
  2. matlab int 求定积分
  3. C语言关键字必备练习题
  4. 解压vmlinuz和解压initrd(initramfs)
  5. 【离散数学】集合论 第四章 函数与集合(6) 三歧性定理、两集合基数判等定理(基数的比较)、Cantor定理
  6. 三菱 MX COMPONENT下载及安装测试
  7. android java_Android开发和JAVA开发有什么区别?
  8. 简易语音助手—python
  9. RS485使用串口输出最后一个字节固定为FF
  10. 人工智能的主要研究领域