Java 绘制带圆角头像的二维码
导入相关的jar包
<!--Qrcode creator--><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.2</version></dependency><dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.4.0</version></dependency><dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.8</version></dependency>
绘制带头像的二维码
public class QrCodeCreator {/*** 创建带有Logo的二维码** @param logoUrl logo的url* @param jumpUrl 跳转的url* @param params 跳转参数* @return {@link byte[]}*/public static byte[] createLogoQrCode(String logoUrl, String jumpUrl, Map<String, String> params) {// 1、设置二维码的一些参数HashMap<EncodeHintType, Object> hints = new HashMap<>(8);// 1.1设置字符集hints.put(EncodeHintType.CHARACTER_SET, "utf-8");// 1.2设置容错等级;因为有了容错,在一定范围内可以把二维码p成你喜欢的样式hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);// 1.3设置外边距,二维码与白色区域;(即白色区域)hints.put(EncodeHintType.MARGIN, 1);// 2、生成二维码try {// 2.1定义BitMatrix对象BitMatrix bitMatrix = new MultiFormatWriter().encode(RequestUrlBuilder.buildRequestUrl(jumpUrl, params), BarcodeFormat.QR_CODE, GlobalConstant.QRCORD_WIDTH, GlobalConstant.QRCORD_HEIGHT, hints);//2、获取二维码宽高int codeWidth = bitMatrix.getWidth();int codeHeight = bitMatrix.getHeight();//3、将二维码放入缓冲流BufferedImage image = new BufferedImage(codeWidth, codeHeight, BufferedImage.TYPE_INT_RGB);for (int i = 0; i < codeWidth; i++) {for (int j = 0; j < codeHeight; j++) {//4、循环将二维码内容定入图片image.setRGB(i, j, bitMatrix.get(i, j) ? GlobalConstant.BLACK : GlobalConstant.WHITE);}}BufferedImage logoImage = null;try {URL url = new URL(logoUrl);logoImage = ImageIO.read(url);// 2.4在二维码中添加logo} catch (Exception e) {e.printStackTrace();}return addLogo(image, logoImage);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}/*** 添加logo** @param logoImage 标志形象* @param qrcodeImage qrcode形象* @return {@link byte[]}*/private static byte[] addLogo(BufferedImage qrcodeImage, BufferedImage logoImage) {try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {if (logoImage == null) {Thumbnails.of(qrcodeImage).scale(1).outputFormat("jpg").toOutputStream(outputStream);return outputStream.toByteArray();}// 3、计算图片放置的位置int x = (qrcodeImage.getWidth() - GlobalConstant.LOGO_WIDTH) / 2;int y = (qrcodeImage.getHeight() - GlobalConstant.LOGO_HEIGHT) / 2;//白底与头像的距离int logoBorder = 10;//画一个透明的外圈BufferedImage whiteBase = new BufferedImage(GlobalConstant.LOGO_WIDTH, GlobalConstant.LOGO_HEIGHT, BufferedImage.TYPE_INT_RGB);Graphics2D graphics = whiteBase.createGraphics();//设置颜色graphics.setColor(Color.WHITE);//填充graphics.fillRect(0, 0, whiteBase.getWidth(), whiteBase.getHeight());graphics.drawImage(whiteBase, 0, 0, GlobalConstant.LOGO_WIDTH, GlobalConstant.LOGO_HEIGHT, null);graphics.dispose();//绘画白底,设置圆角Graphics2D graphics2 = qrcodeImage.createGraphics();graphics2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);int padding = logoBorder / 2;graphics2.setClip(new RoundRectangle2D.Double(x - padding, x - padding, GlobalConstant.LOGO_WIDTH, GlobalConstant.LOGO_HEIGHT, 15, 15));graphics2.drawImage(whiteBase, x - padding, x - padding, GlobalConstant.LOGO_WIDTH, GlobalConstant.LOGO_HEIGHT, null);graphics2.dispose();// 1、读取二维码图片,并构建绘图对象Graphics2D graph = qrcodeImage.createGraphics();graph.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);graph.setClip(new RoundRectangle2D.Double(x, y, GlobalConstant.LOGO_WIDTH - logoBorder, GlobalConstant.LOGO_HEIGHT - logoBorder, 15, 15));// 4、绘制图片graph.drawImage(logoImage, x, y, GlobalConstant.LOGO_WIDTH - logoBorder, GlobalConstant.LOGO_HEIGHT - logoBorder, null);graph.dispose();Thumbnails.of(qrcodeImage).scale(1).outputFormat("jpg").toOutputStream(outputStream);return outputStream.toByteArray();} catch (Exception e) {e.printStackTrace();}return null;}}
RequestUrlBuilder.java
public class RequestUrlBuilder {public static String buildRequestUrl(String url, Map<String, String> params) {if (params == null || params.isEmpty()) {return url;}StringBuilder builder = new StringBuilder();// 如果以/结果,去掉/if (url.endsWith("/")) {builder.append(url, 0, url.length() - 1);} else {builder.append(url);}if (!(url.endsWith("?") || url.endsWith("&"))) {if (url.contains("?")) {builder.append("&");} else {builder.append("?");}}return builder.append(buildQuery(params)).toString();}
}
测试代码:
@Testpublic void drawQrcode() {byte[] bytes = QrCodeCreator.createLogoQrCode("https://liaomr.com/img/photo.jpg", "https://liaomr.com/", null);try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes)) {Thumbnails.of(byteArrayInputStream).scale(1).toFile("D:\\qrcode.jpg");} catch (IOException e) {e.printStackTrace();}}
最终结果:
Java 绘制带圆角头像的二维码相关推荐
- java 生成带网络头像的二维码
最近做一个带微信头像的二维码的功能,微信头像是一个链接,所以先把微信头像下载,临时保存,生成二维码 /*** 文件下载工具类** @author zhengxinghua*/ public class ...
- Python生成带圆角图片的二维码
示例代码1 #!/usr/bin/python # -*- coding: UTF-8 -*- # author: Carl time:2020/5/15import qrcode from PIL ...
- Java 代码基于开源组件生成带头像的二维码
二维码在我们目前的生活工作中,随处可见,日常开发中难免会遇到需要生成二维码的场景,网上也有很多开源的平台可以使用,不过这里我们可以通过几个开源组件,自己来实现一下. 在动手之前我们先思考一下需要进行的 ...
- Java 代码基于开源组件生成带头像的二维码,推荐收藏
二维码在我们目前的生活工作中,随处可见,日常开发中难免会遇到需要生成二维码的场景,网上也有很多开源的平台可以使用,不过这里我们可以通过几个开源组件,自己来实现一下. 在动手之前我们先思考一下需要进行的 ...
- uniapp之小程序端生成分享海报(带自定义参数的二维码)
内容需求: 小程序端生成一个海报,海报内容包括当前授权账号的头像,当前授权账号的邀请码,一张特定图片,分享页面的带对应参数的小程序二维码:生成的海报需要保存到本地 功能方法: 1.前端用canvas绘 ...
- JAVA 生成数据表图标LOGO二维码
JAVA 生成数据表图标LOGO二维码 private static final int QRCOLOR = 0xFF000000; // 默认是黑色private static final int ...
- 小程序识别带多个参数二维码进入商品详情
小程序识别带多个参数二维码进入商品详情 前提: 因为在商品详情页面中有个一功能是点击分享生成海报,海报上面有商品信息以及商品小程序码,用户通过将海报分享给别人的时候,那个人可以通过识别那个商品小程序码 ...
- java与前端实现7种二维码
OC](java与前端实现7种二维码) 1.项目结构 springboot项目 2.后端 QrcodeController package com.ljs.controller;import com. ...
- 批量制作带LOGO的网址二维码
现在我们的生活中随处可见二维码的身影,扫码付款,扫描进入小程序,扫码关注等等.二维码可以存储各种信息,主要包括网址.名片.文本信息.特定代码等.今天跟大家分享使用条码软件批量制作带LOGO的网址二维码 ...
最新文章
- 程序员吐槽:非常后悔3年前选择加入互联网行业,因为短期的高工资断送了自己长期的职业生涯发展...
- Oracle视图添加约束,Oracle的约束视图
- 60条令你大吃一惊的小常识,很有用
- Create C++ Windows Forms Application in Visual Studio 2017
- elif在python中啥意思_python中elif 结构语句怎么判断?
- ToolPart的简单开发
- ArcEngine判断要素(feature)是否为multipart feature及分解(炸开)代码
- leetcode 1207. 独一无二的出现次数(map+set)
- 外设键盘_记得那个被称为‘顶级外设’的国产品牌吗,现在推出这样一把键盘...
- Python科学计算库numpy中的add运算
- [Data Structure Algorithm] 有向无环图的拓扑排序及关键路径
- 10. 二进制中1的个数(C++版本)
- Redis集群添加数据报错(error) CLUSTERDOWN The cluster is down
- Android NFC 标签 读写
- C语言 输出数组中的全部元素的三种方法
- TeamTalk服务器编译与部署
- Ubuntu16.04安装网易云音乐后打不开
- 2014年全球手游市场发展的六大趋势
- 长园创新研究院 招聘FPGA高级工程师
- JavaWeb书城项目(一)
热门文章
- SpringBoot mybatis多数据源配置,记录下我磕磕碰碰的三个月找工作经历
- Allegro PCB Design GXL (legacy) - 导出 PCB 中元件的坐标文件
- VIVO手机测试指令代码大全
- (八)理解迭代思维(80)
- STM32 CAN通信的学习笔记总结(从小白开始)
- linux查看文件内容常用命令
- OSS视频上传后直接播放只有声音没有画面
- 西门子SMART200程序 PID的控制写法,突破8路
- 韩国区块链步入快车道:SM、Kakao、三星、LG等巨头ALL IN
- 优惠券通用测试要点 V1.1