一、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生成彩色或带图片的二维码相关推荐

  1. iOS 开发 二维码生成大全(黑白/彩色二维码和带图片的二维码)详解

    前言 扫描二维码使用的是coreImage框架,属于UIKit框架中的体系,多以使用时不用导入coreImage框架 开始之前,让我们谈谈Core Image框架中最重要的几个类: CIContext ...

  2. 二维码中加图片(打印带图片的二维码)

    在二维码中,放入图片,遮挡一部分是被允许的. 二维码在少许损伤的情况下还可以读取出来,图片可以放置的位置如图的黄色区域.(具体可以放多大要看二维码生成时的纠错能力) 二维码的纠错级别: 纠错级别越高, ...

  3. 微信公众号开发之生成并扫描带参数的二维码(无需改动)

    首先把参考的博文罗列出来: 1.微信公众号开发之生成并扫描带参数的二维码: https://blog.csdn.net/qq_23543983/article/details/80228558 2.由 ...

  4. 微信公众号开发之生成并扫描带参数的二维码

    生成带参数二维码详见微信公众平台之生成带参数的二维码 具体步骤:可在微信测试平台https://mp.weixin.qq.com/debug进行生成 生成结果如下: 拿到ticket 请求 https ...

  5. 收藏一个网站可以在线生成带图片的二维码

    iconqr.sinaapp.com

  6. springboot中使用freemarker生成word循环输出图片(二维码)

    1.先创建一个word文件(建议word2003,低版本兼容性好一点),在word中按照自己的需求做好文档. 2.另存为xml文件(建议与word一致即word2003xml),用可以查看xml文件的 ...

  7. (转)ZXing生成二维码和带logo的二维码,模仿微信生成二维码效果

    场景:移动支付需要对二维码的生成与部署有所了解,掌握目前主流的二维码生成技术. 1 ZXing 生成二维码 首先说下,QRCode是日本人开发的,ZXing是google开发,barcode4j也是老 ...

  8. ZXing生成二维码和带logo的二维码,模仿微信生成二维码效果

    首先说下,QRCode是日本人开发的,ZXing是google开发,barcode4j也是老美开发的,barcode4j对一维条形码处理的很好,而且支持的格式很多,当然也可以对二维码进行处理,效果个人 ...

  9. vue使用qrcodejs2生成带log的二维码图片,vue生成二维码图片中间带log,自定义log

    安装插件 npm install qrcodejs2 --save 在页面中引入 import QRcode from 'qrcodejs2' 普通的二维码 此处的id就是页面中要展示二维码容器的id ...

  10. 使用zxing生成带logo的二维码图片,自动调节logo图片相对二维码图片的大小

    使用zxing生成带logo的二维码图片,自动调节logo图片相对二维码图片的大小  * 可选是否带logo,可选是否保存二维码图片:结果返回base64编码的图片数据字符串  * 页面显示:< ...

最新文章

  1. 第六课.GNN的可解释性
  2. 一个理想主义者关于爱情和美女、事业与金钱的疯人痴语
  3. 139.00.005 Git学习-分支管理
  4. avoid error when import AssemblyKeyFile
  5. 正在使用.NET Framework 2.0 Beta 2的开发者要注意了!
  6. JS:2.1,流程控制(if,switch)高级
  7. mysql管理员就业_MySQL管理员必备的十大工具盘点
  8. leetcode - 516. 最长回文子序列
  9. Bitcoin-NG 可扩展的区块链协议
  10. 《数据结构与算法分析:C语言描述》复习——第六章“排序”——插入排序
  11. 利用分类模型学习特征权重
  12. 关于Qt的dateTime和时间戳转化数据不对的问题
  13. 《信号与系统》解读 前言:经典教材的选择
  14. 【STM32H7教程】第2章 STM32H7的开发环境搭建
  15. 利用Python爬虫建立自己的磁力搜索引擎
  16. ysoserial exploit/JRMPClient原理剖析
  17. hdu 5208 Where is Bob
  18. SpringData示例
  19. 「Vue实战」武装你的前端项目
  20. 首个可用于深度学习的ToF相关数据集——基于置信度的立体相机以及ToF相机深度图融合框架

热门文章

  1. 达内python第一次月考题目_第一次月考总结
  2. JVM -verbose参数详解
  3. uni-app nvue/vue 引入第三方字体教程,在线ttf转base64和在线识别字体网站分享
  4. apicloud 打开高德地图进行导航
  5. 你知道微服务如何拆分,能解决哪些问题?
  6. POI加密Excel文件导出
  7. 刚申请的博客,就发一个老师让做的“一分钟打动面试官”作业做为纪念吧!!!...
  8. 2009中文菜谱网站排行之十大兵器
  9. LZJ流体质量计算机价格,LZJ-ⅢC型流体质量计算机技巧.doc
  10. python如何编写爬虫程序_python编写网络爬虫程序