Java实现带logo的二维码
Java实现带logo的二维码
二维码应用到生活的各个方面,会用代码实现二维码,我想一定是一项加分的技能。好了,我们来一起实现一下吧。
我们实现的二维码是基于QR Code的标准的,QR Code是由日本Denso公司于1994年研制的一种矩阵二维码符号码,全称是Quick Response Code
QR Code:专利公开,支持中文;
QR Code与其他二维码相比,具有识读速度快、数据密度大、占用空间小的优势;
纠错能力:
L级:约可纠错7%的数据码字
M级:约可纠错15%的数据码字
Q级:约可纠错25%的数据码字
H级:约可纠错30%的数据码字
知道了这些硬知识后,我们做一下准备工作,我们需要下载两个jar包,辅助我们开发,这里我放上链接
http://mavenrepository.com/artifact/com.google.zxing/javase
http://mavenrepository.com/artifact/com.google.zxing/core/3.3.2
我们在我们的工程下,新建一个java project 项目就可以了,可以新建三个lib、utils、test三个文件夹;lib存放jar包,utils放我们写的工具类,test用来放我们写的测试类
我们先从不带logo的二维码开始
思路:
1、设置一些二维码的参数;如 字符集、外边距、容错等级
2、生成二维码
好了,我们来实现一下
/**
*
* @param width 二维码的宽
*
* @param height 二维码的高
*
* @param content 二维码的内容
*
*/
public static void createQrCode(int width, int height, String content) {
// 1、设置二维码的一些参数
HashMap hints = new HashMap();
// 1.1设置字符集
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
// 1.2设置容错等级;因为有了容错,在一定范围内可以把二维码p成你喜欢的样式
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
// 1.3设置外边距;(即白色区域)
hints.put(EncodeHintType.MARGIN, 1);
// 2、生成二维码
try {
// 2.1定义BitMatrix对象
BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
// 2.2、设置二维码存放路径,以及二维码的名字
Path codePath = new File("c:/Users/admin/Desktop/code/" + UUID.randomUUID() + ".png").toPath();
// 2.3、执行生成二维码
MatrixToImageWriter.writeToPath(bitMatrix, "png", codePath);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
我们来实现一下带logo的二维码
思路:
1、 我们先生成一个LogoConfig的配置类,主要是设置logo边框颜色;logo边框宽度;logo大小
2、 设置一些二维码的参数
3、 生成二维码
4、 生成带logo的二维码
我们来实现一下
LogoConfig类
class LogoConfig {
// logo默认边框颜色
public static final Color DEFAULT_BORDERCOLOR = Color.WHITE;
// logo默认边框宽度
public static final int DEFAULT_BORDER = 2;
// logo大小默认为照片的1/6
public static final int DEFAULT_LOGOPART = 6;
private final int border = DEFAULT_BORDER;
private final Color borderColor;
private final int logoPart;
public LogoConfig() {
this(DEFAULT_BORDERCOLOR, DEFAULT_LOGOPART);
}
public LogoConfig(Color borderColor, int logoPart) {
this.borderColor = borderColor;
this.logoPart = logoPart;
}
public Color getBorderColor() {
return borderColor;
}
public int getBorder() {
return border;
}
public int getLogoPart() {
return logoPart;
}
}
生成中间有logo的二维码的工具函数
/**
* 生成中间有logo的二维码
*
* @param width
* @param height
* @param content
*/
public static void createLogoQrCode(int width, int height, String content) {
// 1、设置二维码的一些参数
HashMap hints = new HashMap();
// 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(content, BarcodeFormat.QR_CODE, width, height, hints);
// 2.2、设置二维码存放路径,以及二维码的名字
// qrFile用来存放生成的二维码图片
File qrFile = new File("c:/Users/admin/Desktop/code", UUID.randomUUID() + ".jpg");
// logoFile用来存放带有logo的二维码图片
File logoFile = new File("c:/Users/admin/Desktop/code", "test.jpg");
// 2.3、执行生成二维码
MatrixToImageWriter.writeToPath(bitMatrix, "jpg", qrFile.toPath());
// 2.4在二维码中添加logo
LogoConfig logoConfig = new LogoConfig();
addLogo(qrFile, logoFile, logoConfig);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
添加logo的工具类
/**
*
* @param qrPic 二维码文件路径
* @param logoPic logo文件路径
* @param logoConfig 配置类
*/
private static void addLogo(File qrPic, File logoPic, LogoConfig logoConfig) {
if (!qrPic.isFile() || !logoPic.isFile()) {
System.out.println("file not found!");
System.exit(0);
}
try {
// 1、读取二维码图片,并构建绘图对象
BufferedImage image = ImageIO.read(qrPic);
Graphics2D graph = image.createGraphics();
// 2、读取logo图片
BufferedImage logo = ImageIO.read(logoPic);
int widthLogo = image.getWidth() / logoConfig.getLogoPart();
int heightLogo = image.getHeight() / logoConfig.getLogoPart();
// 3、计算图片放置的位置
int x = (image.getWidth() - widthLogo) / 2;
int y = (image.getHeight() - heightLogo) / 2;
// 4、绘制图片
graph.drawImage(logo, x, y, widthLogo, heightLogo, null);
graph.drawRoundRect(x, y, widthLogo, heightLogo, 10, 10);
graph.setStroke(new BasicStroke(logoConfig.getBorder()));
graph.setColor(logoConfig.getBorderColor());
graph.drawRect(x, y, widthLogo, heightLogo);
graph.dispose();
ImageIO.write(image, "jpeg", new File("C:/Users/admin/Desktop/code/newPic.jpg"));
} catch (Exception e) {
System.out.println(e);
}
}
我们写一个测试类来测试一下
@Test
public void test() {
QrCodeUtils.createQrCode(100, 100, "你好,世界");
QrCodeUtils.readQrCode("C:\\Users\\admin\\Desktop\\code\\4ad3a0a4-8d5c-4cd3-9ee5-5f680233a33f.png");
QrCodeUtils.createLogoQrCode(300, 300, "https://www.jianshu.com/u/f84a2d49420b");
QrCodeUtils.readQrCode("C:\\Users\\admin\\Desktop\\code\\newPic.jpg");
}
我就不放生成好的二维码了,大家可以自己试试
我们补充一个读取二维码内容的工具函数
/**
* 解析二维码
*
* @param codePath 二维码存放全路径
*
*/
public static void readQrCode(String codePath) {
try {
MultiFormatReader formatReader = new MultiFormatReader();
File QrCode = new File(codePath);
BufferedImage image = ImageIO.read(QrCode);
BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(image)));
// 设置二维码的参数
HashMap hints = new HashMap();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
Result result = formatReader.decode(binaryBitmap, hints);
// 打印解析结果
System.out.println(result.toString());
// 打印二维码格式
System.out.println(result.getBarcodeFormat());
// 二维码文本内容
System.out.println(result.getText());
} catch (Exception e) {
System.out.println(e);
}
}
注:二维码是有一定纠错能力的,你可以把二维码p成你喜欢的样式
Java实现带logo的二维码的更多相关文章
- java生成带logo的二维码,自定义大小,logo路径取服务器端
package com.qishunet.eaehweb.util; import java.awt.BasicStroke; import java.awt.Graphics; import jav ...
- JAVA生成带Logo的二维码
1.下载生成二维码所需要的jar包qrcode.jar: 2.直接上生成二维码的java代码 //需要导入的包 import java.awt.Color;import java.awt.Graphi ...
- Java生成带logo 的二维码
这个工具类主要实现了两点功能: 1. 生成任意文链接的二维码. 2. 在二维码的中间加入图像. 主要实现步骤: 第一步: 导入QR二维码3.0 版本的core包和一张jpg图片(logo). core ...
- C#生成带logo的二维码
带logo的二维码生成分为两步骤:首先根据输入的内容生成二维码图片,然后读取本地的logo图片,通过图片处理生成带logo的二维码. 生成的二维码效果如下: 下面直接贴出二维码生成类 QRCode ...
- .NET生成带Logo的二维码
使用ThoughtWorks.QRCode生成,利用这个库来生成带Logo的二维码(就是中间嵌了一个图片的二维码),直接见代码: HttpContext context = HttpContext.C ...
- 制作、解析带logo的二维码
用DecoderQRCode来解析带logo的二维码,发现报错,解析不了,于是便又查资料,找到了更强大的制作二维码 工具:GooleZXing 首先下GooleZXing的jar包. -------- ...
- C# ZXing.Net生成二维码、识别二维码、生成带Logo的二维码(二)
1.使用ZXint.Net生成带logo的二维码 /// <summary> /// 生成带Logo的二维码 /// </summary> /// <param name ...
- 生成二维码、条形码、带logo的二维码
Nuget安装ZXing.Net,帮助类: using System; using System.Collections.Generic; using System.Drawing; using Sy ...
- jQuery-qrcode.js 生成带Logo 的二维码
引入文件 jQuery-qrcode.js 地址:https://blog-static.cnblogs.com/files/kitty-blog/jquery-qrcode.js https:// ...
随机推荐
- [CodeForces 1141A] Game 23
题目链接:http://codeforces.com/problemset/problem/1141/A 首先,nn一定要是mm的倍数.否则就无法转换,输出-1: 然后令k=.\frac{m}{n} ...
- No executable found matching command "dotnet-aspnet-codegenerator"
vs2017,mvc新建控制器报错. 右键项目,选择编辑工程文件(.csproj),加入以下节点 <ItemGroup> <DotNetCliToolReference Includ ...
- git 管理和存储二进制大文件
git 管理二进制文件 本文档将逐步带你体验 git 的大文件管理方式. 环境: windows10 64位 cmd git版本: git version 2.18.0.windows.1 创建到推送 ...
- 廖雪峰 JavaScript 学习笔记(判断、循环)
条件判断 固定格式:if () { ... } else { ... } ,else可选 1.多行条件判断,通常把else if连写在一起,来增加可读性 例子: var age = 3; if (a ...
- Windowsphone8外包团队——wp8控件学习资源整理
一天一天学 windows phone 控件 之 Slider(十七) 摘要:Slider 是我们最常见的控件之一,看到最多的一般在两个地方 ,一个是声音的大小,一个是色域.控制声音大小的网上很多, ...
- [原]Universal Windows问题:winapifamily问题:WINAPI_PARTITION_DESKTOP问题:WINAPI_PARTITION_APP问题:WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)问题
问题回顾: 我新建的生成dll的vs问题: 此vs项目包含需要GL.h 结果此文件声明的GLint找不到! 进去发现#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITI ...
- Linux下Java环境安装
本节主要讲解Linux(Centos 6.5)下Java环境的安装 1. 卸载机器上默认安装的JDK 在Linux环境下一般会默认安装jdk,为了自己项目的开发部署,一般情况要重新装jdk,而且自己装 ...
- Spring 中StopWatch用法
背景 有时我们在做开发的时候需要记录每个任务执行时间,或者记录一段代码执行时间,最简单的方法就是打印当前时间与执行完时间的差值,然后这样如果执行大量测试的话就很麻烦,并且不直观,如果想对执行的时间做进 ...
- 接口文档模板(Markdown)
效果 目录 1. 查询指定项目属性接口 1. 查询指定项目属性 接口功能 获取制定项目的分类信息 URL http://www.api.com/index.php 支持格式 JSON HTTP请求方式 ...
- java poi excel操作 把第一列放到最后去
@Override public void adjustExcleColumnPosition(String filePath,int col) throws Exception{ File file ...