使用zxing生成彩色或带图片的二维码
一、zxing api的pom依赖
<!-- https://mvnrepository.com/artifact/com.google.zxing/core --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.0</version></dependency><!-- https://mvnrepository.com/artifact/com.google.zxing/javase --><dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.3.0</version></dependency>
二、生成普通的二维码
package com.mengfei.util;import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;import java.io.File;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;/*** @author Alex* @date 2018/3/18* @description 使用zxing生成普通的二维码*/
public class CreateQRCode {public static void main(String[] args) {//二维码图片的宽度int width = 300;//二维码图片的高度int height = 300;//二维码图片的格式String format = "jpg";//二维码内容(支持中文),使用微信扫描后可直接跳转到百度String content = "https://www.baidu.com/";//定义二维码内容参数Map hints = new HashMap();//设置字符集编码格式hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");//设置容错等级,在这里我们使用M级别hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);//设置边框距hints.put(EncodeHintType.MARGIN, 2);//生成二维码try {//生成二维码的内容BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);//指定生成图片的保存路径Path file = new File("C:\\Users\\Alexs\\Desktop\\blogimages\\qrcode.jpg").toPath();//生成二维码MatrixToImageWriter.writeToPath(bitMatrix, format, file);System.out.println("二维码生成成功!");} catch (Exception e) {e.printStackTrace();}}}
三、解析二维码
package com.mengfei.util;import com.google.zxing.BinaryBitmap;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.HybridBinarizer;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.HashMap;
import java.util.Map;/*** @author Alex* @date 2018/3/18* @description 使用zxing解析二维码*/
public class ParseQRCode {public static void main(String[] args) {try {MultiFormatReader formatReader = new MultiFormatReader();File file = new File("C:\\Users\\Alexs\\Desktop\\blogimages\\qrcode.jpg");BufferedImage image = ImageIO.read(file);BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(image)));//定义二维码的参数Map hints = new HashMap();hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");Result result = formatReader.decode(binaryBitmap, hints);System.out.println("二维码格式类型:" + result.getBarcodeFormat());System.out.println("二维码文本内容:" + result.getText());} catch (Exception e) {e.printStackTrace();}}
}
四、生成彩色的二维码
package com.mengfei.util;import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;/*** @author Alex* @date 2018/3/18* @description 生成彩色的二维码*/
public class CreateColourORCode {// 二维码写码器private static MultiFormatWriter mutiWriter = new MultiFormatWriter();public static void encode(String content, int width, int height, String destImagePath) {try {//生成图片文件ImageIO.write(genBarcode(content, width, height), "jpg", new File(destImagePath));System.out.println("二维码生成成功!");} catch (IOException e) {e.printStackTrace();} catch (WriterException e) {e.printStackTrace();}}/*** 得到BufferedImage** @param content 二维码显示的文本* @param width 二维码的宽度* @param height 二维码的高度* @return* @throws WriterException* @throws IOException*/private static BufferedImage genBarcode(String content, int width, int height) throws WriterException, IOException {//定义二维码内容参数Map<EncodeHintType, Object> hints = new HashMap<>();//设置字符集编码格式hints.put(EncodeHintType.CHARACTER_SET, "utf-8");//设置容错等级,在这里我们使用M级别hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);// 生成二维码,参数顺序分别为:编码内容,编码类型,生成图片宽度,生成图片高度,设置参数BitMatrix matrix = mutiWriter.encode(content, BarcodeFormat.QR_CODE, width, height, hints);// 二维矩阵转为一维像素数组int halfW = matrix.getWidth() / 2;int halfH = matrix.getHeight() / 2;int[] pixels = new int[width * height];for (int y = 0; y < matrix.getHeight(); y++) {for (int x = 0; x < matrix.getWidth(); x++) {// 二维码颜色(RGB)int num1 = (int) (50 - (50.0 - 13.0) / matrix.getHeight()* (y + 1));int num2 = (int) (165 - (165.0 - 72.0) / matrix.getHeight()* (y + 1));int num3 = (int) (162 - (162.0 - 107.0)/ matrix.getHeight() * (y + 1));Color color = new Color(num1, num2, num3);int colorInt = color.getRGB();// 此处可以修改二维码的颜色,可以分别制定二维码和背景的颜色;pixels[y * width + x] = matrix.get(x, y) ? colorInt : 16777215;// 0x000000:0xffffff}}BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);image.getRaster().setDataElements(0, 0, width, height, pixels);return image;}public static void main(String[] args) throws UnsupportedEncodingException {// 依次为内容(不支持中文),宽,长,logo图标路径,储存路径CreateColourORCode.encode("https://www.baidu.com/", 300, 300, "C:\\Users\\Alexs\\Desktop\\blogimages\\qrcode.jpg");}
}
五、生成彩色带图片的二维码
package com.mengfei.util;import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Hashtable;
import java.util.Map;/*** @author Alex* @date 2018/3/18* @description 使用zxing生成彩色带图片的二维码*/
public class CreateColourImageORCode {// 图片宽度的一半private static final int IMAGE_WIDTH = 100;private static final int IMAGE_HEIGHT = 100;private static final int IMAGE_HALF_WIDTH = IMAGE_WIDTH / 2;private static final int FRAME_WIDTH = 2;// 二维码写码器private static MultiFormatWriter mutiWriter = new MultiFormatWriter();public static void encode(String content, int width, int height, String srcImagePath, String destImagePath) {try {//生成图片文件ImageIO.write(genBarcode(content, width, height, srcImagePath), "jpg", new File(destImagePath));System.out.println("二维码生成成功!");} catch (IOException e) {e.printStackTrace();} catch (WriterException e) {e.printStackTrace();}}/*** 得到BufferedImage** @param content 二维码显示的文本* @param width 二维码的宽度* @param height 二维码的高度* @return* @throws WriterException* @throws IOException*/private static BufferedImage genBarcode(String content, int width,int height, String srcImagePath) throws WriterException,IOException {// 读取源图像BufferedImage scaleImage = scale(srcImagePath, IMAGE_WIDTH,IMAGE_HEIGHT, true);int[][] srcPixels = new int[IMAGE_WIDTH][IMAGE_HEIGHT];for (int i = 0; i < scaleImage.getWidth(); i++) {for (int j = 0; j < scaleImage.getHeight(); j++) {srcPixels[i][j] = scaleImage.getRGB(i, j);//图片的像素点}}//编码Map hints = new Hashtable<EncodeHintType, String>();hints.put(EncodeHintType.CHARACTER_SET, "utf-8");//设置容错等级,在这里我们使用M级别hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);// 生成二维码BitMatrix matrix = mutiWriter.encode(content, BarcodeFormat.QR_CODE, width, height, hints);// 二维矩阵转为一维像素数组int halfW = matrix.getWidth() / 2;int halfH = matrix.getHeight() / 2;int[] pixels = new int[width * height];for (int y = 0; y < matrix.getHeight(); y++) {for (int x = 0; x < matrix.getWidth(); x++) {// 左上角颜色,根据自己需要调整颜色范围和颜色/*if (x > 0 && x < 170 && y > 0 && y < 170) {Color color = new Color(231, 144, 56);int colorInt = color.getRGB();pixels[y * width + x] = matrix.get(x, y) ? colorInt: 16777215;} else*/// 读取图片if (x > halfW - IMAGE_HALF_WIDTH&& x < halfW + IMAGE_HALF_WIDTH&& y > halfH - IMAGE_HALF_WIDTH&& y < halfH + IMAGE_HALF_WIDTH) {pixels[y * width + x] = srcPixels[x - halfW+ IMAGE_HALF_WIDTH][y - halfH + IMAGE_HALF_WIDTH];}// 在图片四周形成边框else if ((x > halfW - IMAGE_HALF_WIDTH - FRAME_WIDTH&& x < halfW - IMAGE_HALF_WIDTH + FRAME_WIDTH&& y > halfH - IMAGE_HALF_WIDTH - FRAME_WIDTH && y < halfH+ IMAGE_HALF_WIDTH + FRAME_WIDTH)|| (x > halfW + IMAGE_HALF_WIDTH - FRAME_WIDTH&& x < halfW + IMAGE_HALF_WIDTH + FRAME_WIDTH&& y > halfH - IMAGE_HALF_WIDTH - FRAME_WIDTH && y < halfH+ IMAGE_HALF_WIDTH + FRAME_WIDTH)|| (x > halfW - IMAGE_HALF_WIDTH - FRAME_WIDTH&& x < halfW + IMAGE_HALF_WIDTH + FRAME_WIDTH&& y > halfH - IMAGE_HALF_WIDTH - FRAME_WIDTH && y < halfH- IMAGE_HALF_WIDTH + FRAME_WIDTH)|| (x > halfW - IMAGE_HALF_WIDTH - FRAME_WIDTH&& x < halfW + IMAGE_HALF_WIDTH + FRAME_WIDTH&& y > halfH + IMAGE_HALF_WIDTH - FRAME_WIDTH && y < halfH+ IMAGE_HALF_WIDTH + FRAME_WIDTH)) {pixels[y * width + x] = 0xfffffff;} else {// 二维码颜色(RGB)int num1 = (int) (50 - (50.0 - 13.0) / matrix.getHeight()* (y + 1));int num2 = (int) (165 - (165.0 - 72.0) / matrix.getHeight()* (y + 1));int num3 = (int) (162 - (162.0 - 107.0)/ matrix.getHeight() * (y + 1));Color color = new Color(num1, num2, num3);int colorInt = color.getRGB();// 此处可以修改二维码的颜色,可以分别制定二维码和背景的颜色;pixels[y * width + x] = matrix.get(x, y) ? colorInt : 16777215;// 0x000000:0xffffff}}}BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);image.getRaster().setDataElements(0, 0, width, height, pixels);return image;}/*** 把传入的原始图像按高度和宽度进行缩放,生成符合要求的图标** @param srcImageFile 源文件地址* @param height 目标高度* @param width 目标宽度* @param hasFiller 比例不对时是否需要补白:true为补白; false为不补白;* @throws IOException*/private static BufferedImage scale(String srcImageFile, int height, int width, boolean hasFiller) throws IOException {double ratio = 0.0; // 缩放比例File file = new File(srcImageFile);BufferedImage srcImage = ImageIO.read(file);Image destImage = srcImage.getScaledInstance(width, height,BufferedImage.SCALE_SMOOTH);// 计算比例if ((srcImage.getHeight() > height) || (srcImage.getWidth() > width)) {if (srcImage.getHeight() > srcImage.getWidth()) {ratio = (new Integer(height)).doubleValue()/ srcImage.getHeight();} else {ratio = (new Integer(width)).doubleValue()/ srcImage.getWidth();}AffineTransformOp op = new AffineTransformOp(AffineTransform.getScaleInstance(ratio, ratio), null);destImage = op.filter(srcImage, null);}if (hasFiller) {// 补白BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);Graphics2D graphic = image.createGraphics();graphic.setColor(Color.white);graphic.fillRect(0, 0, width, height);if (width == destImage.getWidth(null))graphic.drawImage(destImage, 0,(height - destImage.getHeight(null)) / 2,destImage.getWidth(null), destImage.getHeight(null),Color.white, null);//画图片elsegraphic.drawImage(destImage,(width - destImage.getWidth(null)) / 2, 0,destImage.getWidth(null), destImage.getHeight(null),Color.white, null);graphic.dispose();destImage = image;}return (BufferedImage) destImage;}public static void main(String[] args) throws UnsupportedEncodingException {// 依次为内容,宽,长,logo图标路径,储存路径CreateColourImageORCode.encode("https://www.baidu.com/", 500, 500, "C:\\Users\\Alexs\\Desktop\\blogimages\\huge.jpg","C:\\Users\\Alexs\\Desktop\\blogimages\\qrcode.jpg");}
}
使用zxing生成彩色或带图片的二维码相关推荐
- iOS 开发 二维码生成大全(黑白/彩色二维码和带图片的二维码)详解
前言 扫描二维码使用的是coreImage框架,属于UIKit框架中的体系,多以使用时不用导入coreImage框架 开始之前,让我们谈谈Core Image框架中最重要的几个类: CIContext ...
- 二维码中加图片(打印带图片的二维码)
在二维码中,放入图片,遮挡一部分是被允许的. 二维码在少许损伤的情况下还可以读取出来,图片可以放置的位置如图的黄色区域.(具体可以放多大要看二维码生成时的纠错能力) 二维码的纠错级别: 纠错级别越高, ...
- 微信公众号开发之生成并扫描带参数的二维码(无需改动)
首先把参考的博文罗列出来: 1.微信公众号开发之生成并扫描带参数的二维码: https://blog.csdn.net/qq_23543983/article/details/80228558 2.由 ...
- 微信公众号开发之生成并扫描带参数的二维码
生成带参数二维码详见微信公众平台之生成带参数的二维码 具体步骤:可在微信测试平台https://mp.weixin.qq.com/debug进行生成 生成结果如下: 拿到ticket 请求 https ...
- 收藏一个网站可以在线生成带图片的二维码
iconqr.sinaapp.com
- springboot中使用freemarker生成word循环输出图片(二维码)
1.先创建一个word文件(建议word2003,低版本兼容性好一点),在word中按照自己的需求做好文档. 2.另存为xml文件(建议与word一致即word2003xml),用可以查看xml文件的 ...
- (转)ZXing生成二维码和带logo的二维码,模仿微信生成二维码效果
场景:移动支付需要对二维码的生成与部署有所了解,掌握目前主流的二维码生成技术. 1 ZXing 生成二维码 首先说下,QRCode是日本人开发的,ZXing是google开发,barcode4j也是老 ...
- ZXing生成二维码和带logo的二维码,模仿微信生成二维码效果
首先说下,QRCode是日本人开发的,ZXing是google开发,barcode4j也是老美开发的,barcode4j对一维条形码处理的很好,而且支持的格式很多,当然也可以对二维码进行处理,效果个人 ...
- vue使用qrcodejs2生成带log的二维码图片,vue生成二维码图片中间带log,自定义log
安装插件 npm install qrcodejs2 --save 在页面中引入 import QRcode from 'qrcodejs2' 普通的二维码 此处的id就是页面中要展示二维码容器的id ...
- 使用zxing生成带logo的二维码图片,自动调节logo图片相对二维码图片的大小
使用zxing生成带logo的二维码图片,自动调节logo图片相对二维码图片的大小 * 可选是否带logo,可选是否保存二维码图片:结果返回base64编码的图片数据字符串 * 页面显示:< ...
最新文章
- 第六课.GNN的可解释性
- 一个理想主义者关于爱情和美女、事业与金钱的疯人痴语
- 139.00.005 Git学习-分支管理
- avoid error when import AssemblyKeyFile
- 正在使用.NET Framework 2.0 Beta 2的开发者要注意了!
- JS:2.1,流程控制(if,switch)高级
- mysql管理员就业_MySQL管理员必备的十大工具盘点
- leetcode - 516. 最长回文子序列
- Bitcoin-NG 可扩展的区块链协议
- 《数据结构与算法分析:C语言描述》复习——第六章“排序”——插入排序
- 利用分类模型学习特征权重
- 关于Qt的dateTime和时间戳转化数据不对的问题
- 《信号与系统》解读 前言:经典教材的选择
- 【STM32H7教程】第2章 STM32H7的开发环境搭建
- 利用Python爬虫建立自己的磁力搜索引擎
- ysoserial exploit/JRMPClient原理剖析
- hdu 5208 Where is Bob
- SpringData示例
- 「Vue实战」武装你的前端项目
- 首个可用于深度学习的ToF相关数据集——基于置信度的立体相机以及ToF相机深度图融合框架
热门文章
- 达内python第一次月考题目_第一次月考总结
- JVM -verbose参数详解
- uni-app nvue/vue 引入第三方字体教程,在线ttf转base64和在线识别字体网站分享
- apicloud 打开高德地图进行导航
- 你知道微服务如何拆分,能解决哪些问题?
- POI加密Excel文件导出
- 刚申请的博客,就发一个老师让做的“一分钟打动面试官”作业做为纪念吧!!!...
- 2009中文菜谱网站排行之十大兵器
- LZJ流体质量计算机价格,LZJ-ⅢC型流体质量计算机技巧.doc
- python如何编写爬虫程序_python编写网络爬虫程序