需求:项目需要把生成的小程序二维码中心的logo换成用户自己的头像

解决方案:

1、先获取到小程序生成的二维码

//小程序路径
String page = "";
//传入小程序appId和小程序secret
JSONObject json = WxMaUtil.getAccessToken(appId, secret);
// 设置请求参数
JSONObject paramJson = new JSONObject();
paramJson.put("scene",XXX); // 你要放的参数
paramJson.put("page", page);//页面地址
paramJson.put("width", 430); // 宽度
paramJson.put("auto_color", true);
InputStream inputStream = WxMaUtil.getAppletEWMInputStream(json.getString("access_token"), paramJson);

2、合并图片需要使用 BufferedImage 类型,因此需要把InputStream 转换成 BufferedImage

//inputStream 转 BufferedInputStream
JPEGImageDecoder decoderFile = JPEGCodec.createJPEGDecoder(inputStream);
BufferedImage bis = decoderFile.decodeAsBufferedImage();

3、获取用户的头像

4、把用户头像缩放到logo大小

// 图片缩放 -----------stat
BufferedImage buffImg1 = ImageIO.read(new URL(url));
// 图片宽度
double width = buffImg1.getWidth();
// 图片高度
double height = buffImg1.getHeight();
//设置大小
if (width > 188 && height > 188) {width = 188/(double)buffImg1.getWidth()*(double)buffImg1.getWidth();height = 188/(double)buffImg1.getHeight()*(double)buffImg1.getHeight();
}
//  ------------end
//缩放图片并转换成 BufferedImage
BufferedImage tag = toBufferedImage(buffImg1.getScaledInstance((int)width, (int)height, Image.SCALE_DEFAULT));

转换BufferedImage使用的工具类

// image 转换成 BufferedImage
public static BufferedImage toBufferedImage(Image image) {if (image instanceof BufferedImage) {return (BufferedImage)image;}image = new ImageIcon(image).getImage();BufferedImage bimage = null;GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();try {int transparency = Transparency.OPAQUE;// Create the buffered imageGraphicsDevice gs = ge.getDefaultScreenDevice();GraphicsConfiguration gc = gs.getDefaultConfiguration();bimage = gc.createCompatibleImage(image.getWidth(null), image.getHeight(null), transparency);} catch (HeadlessException e) {}if (bimage == null) {int type = BufferedImage.TYPE_INT_RGB;bimage = new BufferedImage(image.getWidth(null), image.getHeight(null), type);}Graphics g = bimage.createGraphics();g.drawImage(image, 0, 0, null);g.dispose();return bimage;
}

5、把用户头像改成圆形

BufferedImage resultImg = null;try {if (StringUtils.isBlank(url)) {return null;}// 图片转圆形 --------statresultImg = new BufferedImage(tag.getWidth(), tag.getHeight(), BufferedImage.TYPE_INT_RGB);Graphics2D g = resultImg.createGraphics();Ellipse2D.Double shape = new Ellipse2D.Double(0, 0, tag.getWidth(), tag.getHeight());// 使用 setRenderingHint 设置抗锯齿g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);resultImg =     g.getDeviceConfiguration().createCompatibleImage(tag.getWidth(),tag.getHeight(),Transparency.TRANSLUCENT);g = resultImg.createGraphics();// 使用 setRenderingHint 设置抗锯齿g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);g.setClip(shape);g.drawImage(tag, 0, 0, null);g.dispose();} catch (MalformedURLException e) {log.error("URL格式异常" + e.getMessage(), e);} catch (IOException e) {log.error("读取图片异常" + e.getMessage(), e);}return resultImg;

6、设置一张空白图片覆盖到之前logo位置(因为不确定用户头像是否存在透明背景图片或头像过小无法完全覆盖原有logo,为了美观设置一张空白图片)

7、先合并logo和空白图片,再合并头像

//设置 空白图片覆盖之前logo
BufferedImage c = tt.loadImageLocal("E:/blankImg.png");
//合并图片
BufferedImage bufferedImage1 = tt.addImage(bis, c,118,120);
//合并图片并输出
inputStream = tt.bufferedImageToInputStream(tt.addImage(bufferedImage1, bufferedImage, 120, 120));

合并图片工具类

//两个图片合成一个图片 b 二维码  d 头像
public BufferedImage addImage(BufferedImage b, BufferedImage d,int width,int height) {try {int w = d.getWidth();int h = d.getHeight();Graphics2D g = null;g = b.createGraphics();g.drawImage(d, width, height, w, h, null);g.dispose();} catch (Exception e) {e.printStackTrace();}return b;
}
BufferedImage 转 InputStream工具类
//BufferedImage 转 InputStream
public InputStream bufferedImageToInputStream(BufferedImage image){ByteArrayOutputStream os = new ByteArrayOutputStream();try {ImageIO.write(image, "png", os);InputStream input = new ByteArrayInputStream(os.toByteArray());return input;} catch (IOException e) {e.printStackTrace();}return null;
}

8、往指定位置添加文字并输出

//添加文字
ArrayList<ImageDTO> list = new ArrayList<>();
list.add(createImageDTO(quotation.getQuotationName(),new Color(255,59,48),new java.awt.Font("宋体", Font.PLAIN, 20), 10, 420));
inputStream = tt.bufferedImageToInputStream(WaterMarkUtils.writeImage2(bufferedImage2, list));public static BufferedImage writeImage2(BufferedImage srcImg,  List<ImageDTO> list) {BufferedImage bufImg = null;try {//读取原图片信息int srcImgWidth = srcImg.getWidth(null);//获取图片的宽int srcImgHeight = srcImg.getHeight(null);//获取图片的高//添加文字:bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);Graphics2D g = bufImg.createGraphics();g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);for (ImageDTO imgDTO : list) {g.setColor(imgDTO.getColor());                                  //根据图片的背景设置水印颜色g.setFont(imgDTO.getFont());                                    //设置字体g.drawString(imgDTO.getText(), imgDTO.getX(), imgDTO.getY());   //画出水印}g.dispose();} catch (Exception e) {log.error("==== 系统异常::{} ====", e);}return bufImg;}

原始效果:                                             替换后效果:

          

借鉴了:

https://blog.csdn.net/servermanage/article/details/103470214

https://www.bbsmax.com/A/MyJx66R2dn/

小程序替换二维码logo并添加文字相关推荐

  1. 芝麻动态码-小程序动态二维码生成

    小程序的二维码,是静态的,在公众号里传播的时候,效果不太好,但是因为小程序的logo 很大,可以容纳很多的内容,所以就希望中间的部分可以动态显示. 经过我们的验证,是可行的,来几张效果图 1. 二次元 ...

  2. 【微信小程序】二维码跳转规则的前缀匹配是什么意思?

    前言 基础库 2.12.0 开发者工具 1.03.2008270 微信小程序的二维码跳转规则 为了方便小程序开发者更便捷地推广小程序,兼容线下已有的二维码,微信公众平台开放扫描普通链接二维码跳转小程序 ...

  3. 微信小程序获取二维码中URL中带的参数

    解析微信小程序获取二维码中的url参数 onLoad: function (options) { console.log(options) let qrUrl = decodeURIComponent ...

  4. 小程序推广二维码生成

    小程序推广二维码生成 <?php$appid = '***************';$secret ='********************************';$url = &qu ...

  5. 最新在线客服系统php代码微信软件公众号小程序app二维码聊天网站源码

    最新在线客服系统php代码微信软件公众号小程序app二维码聊天网站源码 管理界面 独家长期更新日志(欢迎反馈BUG) 1.添加手机端前后台声音提示 2.添加后台客户管理显示在线离线 3.添加清空当前对 ...

  6. 微信小程序普通二维码解析

    1.区别于微信小程序官方二维码是直接从onLoad的 options 解构出来就行,它是一个对象,这个大家都知道. 2.普通二维码 也是从onLoad的 options 里解构出来,此时options ...

  7. 小程序海报二维码生成插件

    分享一个小程序海报二维码插件 建议使用方式: 测试环境先改造封装成自己需要的类文件,再引入框架使用,生成图片参考截图 金装 下载地址 海报生成源码下载

  8. 微信小程序扫描二维码或者条码

    程序是需要扫描条形码然后跳转到对应的产品信息页,其实微信小程序就有一个扫码识别的API,下面一起来看看: wx.scanCode(Object object) 调起客户端扫码界面进行扫码. 示例代码: ...

  9. 微信小程序转二维码方法分享

    微信小程序转二维码方法分享 需要转码的可以看看 这个东西是看个人需求的,618就要来了,各种活动也将来袭 有些小伙伴不知道怎么生成 为了方便小程序邀请活动没法外发,这里分享下将小程序转二维码的方法 首 ...

最新文章

  1. 踩准时钟节拍、玩转时间转换,鸿蒙轻内核时间管理有妙招
  2. 大屏数据可视化综合设计
  3. [leetcode]_Best Time to Buy and Sell Stock I II
  4. lavavel php 手册,Laravel文档工具
  5. java serviceimple,java apiimpl怎么调用 service接口
  6. linux抓包-tcpdump
  7. Jenkins平台搭建
  8. java 三维数组 魔方_三维数组的横向/纵向输出
  9. 三年半经验,蚂蚁头条快手怎么选?网友:第一次看到头条比快手offer低的
  10. 智慧工地管理平台可视化解决方案
  11. Java Web 网络商城案例演示十五 订单详情功能(提交订单支付界面)
  12. 专利学习笔记6:在线系统的登录方法
  13. 生信笔记 | 探索PubMed数据库文献
  14. activiti会签功能
  15. 一文了解如何使用移动应用安全组件Soot和Flowdroid
  16. 十进制转换为十六进制-八进制-二进制的进制转换计算
  17. java请求传参方式的总结
  18. 新开店铺改如何推广?告别盲目时代
  19. HERP和单臂路由结合配置时,提示 %IP-4-DUPADDR: Duplicate address错误
  20. 列主元法解线性方程组

热门文章

  1. SSM 框架原理简介及解析
  2. IntelliJ IDEA2020安装使用(保姆级)
  3. 考试一定要加文操..
  4. matlab 小游戏 找不同的颜色
  5. RGB颜色规律小研究
  6. [文档和源码分享]C++实现的基于α-β剪枝算法的井字棋游戏
  7. 利用好 git bisect 这把利器,帮助你快速定位疑难 Bug
  8. mysql数据库asc_mysql数据库
  9. PrimeNG之DataTable
  10. Primeng12+ 使用 full-calendar