二维码

转载请注明出处:https://blog.csdn.net/u013173247/article/details/81748481

二维码又称二维条码,常见的二维码为QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。
上面都是百度百科复制的,知道咱们生成的是矩阵二维码就行。
本文是maven工程使用zxing 3.3.0的版本生成可自定义图片的二维码,并且可以去除二维码白边。(生成二维码有白边,或二维码内容多少改变有白边的同学请看这里)。

maven引入jar:

<dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.0</version>
</dependency>

如果不是maven工程,可以直接下载 jar包下载

准备工作做完了,开始正文。

package com.neusoft.saas.contactcentre.controller.qrCode;import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.Hashtable;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;public class QRCodeFactory {  public static String EncodeQRCODE(String contents, int width, int height,String iconImagePath, String codePath,String ImageName) throws IOException, WriterException{ try{if(width == 0){width = 300; // 二维码图片宽度430}if(height == 0){height = 300; // 二维码图片高度430 }File testFile = new File(codePath);if(!testFile .exists()){testFile.mkdir();//创建目录}testFile = new File(codePath,ImageName);if(!testFile .exists()){testFile.createNewFile();//创建文件}String format = "png";// 二维码的图片格式png  Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();  // 指定纠错等级,纠错级别(L 7%、M 15%、Q 25%、H 30%)  hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);  // 内容所使用字符集编码  hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
//          hints.put(EncodeHintType.MAX_SIZE, 350);//设置图片的最大值
//          hints.put(EncodeHintType.MIN_SIZE, 200);//设置图片的最小值  hints.put(EncodeHintType.MARGIN, 0);   //设置白边 BitMatrix bitMatrix = new MultiFormatWriter().encode(contents,//要编码的内容  //编码类型,目前zxing支持:Aztec 2D,CODABAR 1D format,Code 39 1D,Code 93 1D ,Code 128 1D,  //Data Matrix 2D , EAN-8 1D,EAN-13 1D,ITF (Interleaved Two of Five) 1D,  //MaxiCode 2D barcode,PDF417,QR Code 2D,RSS 14,RSS EXPANDED,UPC-A 1D,UPC-E 1D,UPC/EAN extension,UPC_EAN_EXTENSION  BarcodeFormat.QR_CODE,  width, //条形码的宽度  height, //条形码的高度  hints);//生成条形码时的一些配置,此项可选  // 生成二维码MatrixToImageWriter.writeToFile(bitMatrix, format, testFile,iconImagePath);return codePath+ImageName;} catch (IOException e) {System.err.println("图片读取异常 : "+e.getMessage());} catch (WriterException e) {System.err.println("图片输出异常 :"+e.getMessage());}return null;}    public static void main(String[] args) throws Exception {  try {  String contents = "https://blog.csdn.net/u013173247/article/details/41676495";String codeIconPath = "src/main/resources/view/src/static/images/QRCodeIconImg.png";String codePath =  System.getProperty("user.dir")+"/testQrcode/";String pngStr = new Date().getTime()+".png";String qrcodeImagePath = codePath + pngStr;EncodeQRCODE(contents,280, 280, codeIconPath, codePath,pngStr);  if(qrcodeImagePath != null){File file = new File(qrcodeImagePath);String base64 = ImageUtil.encodeImgageToBase64(file);base64 = base64.replaceAll("\r|\n", "");
//              if (!file.exists()) {
//                  System.out.println("删除文件失败:" + qrcodeImagePath + "刚生成的file不存在!");
//              } else {
//                  if (file.isFile()){
//                      file.delete();
//                  }
//              }System.out.println("base64");System.out.println(base64);}else{System.out.println("报错了!");}} catch (Exception e) {  e.printStackTrace();  }  }
}

生成的二维码如下

上图二维码有很大的白边,看下源码为什么有白边。从这行开始找

BitMatrix bitMatrix = new MultiFormatWriter().encode(contents,//要编码的内容  //编码类型,目前zxing支持:Aztec 2D,CODABAR 1D format,Code 39 1D,Code 93 1D ,Code 128 1D,  //Data Matrix 2D , EAN-8 1D,EAN-13 1D,ITF (Interleaved Two of Five) 1D,  //MaxiCode 2D barcode,PDF417,QR Code 2D,RSS 14,RSS EXPANDED,UPC-A 1D,UPC-E 1D,UPC/EAN extension,UPC_EAN_EXTENSION  BarcodeFormat.QR_CODE,  width, //条形码的宽度  height, //条形码的高度  hints);//生成条形码时的一些配置,此项可选  

往里跳

       case QR_CODE:writer = new QRCodeWriter();break;case CODE_39:writer = new Code39Writer();break;case CODE_93:writer = new Code93Writer();break;case CODE_128:writer = new Code128Writer();break;case ITF:writer = new ITFWriter();break;case PDF_417:writer = new PDF417Writer();break;case CODABAR:writer = new CodaBarWriter();break;case DATA_MATRIX:writer = new DataMatrixWriter();break;case AZTEC:writer = new AztecWriter();break;default:throw new IllegalArgumentException("No encoder available for format " + format);}return writer.encode(contents, format, width, height, hints);

writer.encode(contents, format, width, height, hints)继续往里找

ErrorCorrectionLevel errorCorrectionLevel = ErrorCorrectionLevel.L;int quietZone = QUIET_ZONE_SIZE;if (hints != null) {if (hints.containsKey(EncodeHintType.ERROR_CORRECTION)) {errorCorrectionLevel = ErrorCorrectionLevel.valueOf(hints.get(EncodeHintType.ERROR_CORRECTION).toString());}if (hints.containsKey(EncodeHintType.MARGIN)) {quietZone = Integer.parseInt(hints.get(EncodeHintType.MARGIN).toString());}}QRCode code = Encoder.encode(contents, errorCorrectionLevel, hints);return renderResult(code, width, height, quietZone);

QRCode code = Encoder.encode(contents, errorCorrectionLevel, hints);这行继续往里找

//  Choose the mask pattern and set to "qrCode".int dimension = version.getDimensionForVersion();ByteMatrix matrix = new ByteMatrix(dimension, dimension);int maskPattern = chooseMaskPattern(finalBits, ecLevel, version, matrix);qrCode.setMaskPattern(maskPattern);// Build the matrix and set it to "qrCode".MatrixUtil.buildMatrix(finalBits, ecLevel, version, maskPattern, matrix);qrCode.setMatrix(matrix);

注意!!!

int dimension = version.getDimensionForVersion();

往里找会发现

public int getDimensionForVersion() {return 17 + 4 * versionNumber;}

根据版本号计算出的值,本人的versionNumber值是10
dimension 值为57
main方法中要生成的是280
280/57=4余52
可以跳转生成的数据,比如此二维码可以跳转main方法中的值为228

问题来了:如果内容长度不固定,还想没有白边,怎么办?
接着往下看。

写一个去除白边的方法

public static BitMatrix deleteWhite(BitMatrix matrix){  int[] rec = matrix.getEnclosingRectangle();  int resWidth = rec[2];  int resHeight = rec[3];  BitMatrix resMatrix = new BitMatrix(resWidth, resHeight);  resMatrix.clear();  for (int i = 0; i < resWidth; i++) {  for (int j = 0; j < resHeight; j++) { if (matrix.get(i + rec[0], j + rec[1]))  resMatrix.set(i, j);  }  }  return resMatrix;  }

在代码中调用

 BitMatrix bitMatrix = new MultiFormatWriter().encode(contents,//要编码的内容  //编码类型,目前zxing支持:Aztec 2D,CODABAR 1D format,Code 39 1D,Code 93 1D ,Code 128 1D,  //Data Matrix 2D , EAN-8 1D,EAN-13 1D,ITF (Interleaved Two of Five) 1D,  //MaxiCode 2D barcode,PDF417,QR Code 2D,RSS 14,RSS EXPANDED,UPC-A 1D,UPC-E 1D,UPC/EAN extension,UPC_EAN_EXTENSION  BarcodeFormat.QR_CODE,  width, //条形码的宽度  height, //条形码的高度  hints);//生成条形码时的一些配置,此项可选  // 生成二维码
//          File outputFile = new File(codePath,new Date().getTime()+".png");//指定输出路径  bitMatrix = deleteWhite(bitMatrix);  MatrixToImageWriter.writeToFile(bitMatrix, format, testFile,iconImagePath);

生成的会是没有任何白边的二维码

问题又来了:如果我就想要固定大小白边的怎么办?

修改下去除白边方法的代码

public static BitMatrix deleteWhite(BitMatrix matrix){  int[] rec = matrix.getEnclosingRectangle();int resWidth = rec[2] + 2;int resHeight = rec[3] + 2;BitMatrix resMatrix = new BitMatrix(resWidth, resHeight);  resMatrix.clear();  for (int i = 0; i < resWidth; i++) {  for (int j = 0; j < resHeight; j++) {  if (matrix.get(i + rec[0], j + rec[1]))  resMatrix.set(i+1, j+1);  }  }  return resMatrix;  }

上面代码就是给二位码添加1的白边
完成。最后附上源码下载链接源码下载

转载请注明出处:https://blog.csdn.net/u013173247/article/details/81748481

生成带图片无白边的二维码相关推荐

  1. Vue生成带图片logo以及文字的二维码组件,可下载二维码为图片,附组件调用代码--核心qrcode

    目录 1.初始化qrcode 2.二维码生成以及下载组件代码 可以自己控制是否生成logo以及文字说明 3.父页面调用组件代码 1.初始化qrcode cnpm install --save qrco ...

  2. 微信公众号怎么生成带粉丝关注统计的渠道二维码

    关于微信公众号在线生成带粉丝关注统计的渠道二维码,第三方工具微号帮提供了渠道二维码生成功能实现,可以为公众号生成带粉丝关注统计的渠道二维码,可以生成多个不同的渠道二维码,每个渠道二维码都可以单独统计粉 ...

  3. jquery.qrcode生成带logo和背景图的二维码

    效果图: <html lang="zh-cn"> <head> <title>jQuery生成二维码分享图片</title> < ...

  4. C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码

    本文介绍在 C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码.网上文章大多只是简单介绍内置参数的设置,根据我的使用目的,增加了自定义目标二维码图片尺寸和白边 ...

  5. java二维码生成-谷歌(Google.zxing)开源二维码生成学习及实例

    java二维码生成-谷歌(Google.zxing)开源二维码生成的实例及介绍  这里我们使用比特矩阵(位矩阵)的QR码编码在缓冲图片上画出二维码 实例有以下一个传入参数 OutputStream o ...

  6. Java实现一行代码生成二维码,可传输到前端展示,可自定义二维码样式,可设置图片格式,可对二维码添加图片,可对二维码添加文字,可以设置二维码大小、字体大小、字体颜色、边框颜色、边框大小等等

    Java实现一行代码生成二维码,可传输到前端展示,可自定义二维码样式,可设置图片格式,可对二维码添加图片,可对二维码添加文字,可以设置二维码大小.字体大小.字体颜色.边框颜色.边框大小等等. 0.准备 ...

  7. 雨听|生成指定路径的微信小程序二维码

    生成指定路径的微信小程序二维码 步骤一:登录微信公众平台 步骤二:右上方选择"工具",再选择"生成小程序码" 步骤三:选择需要生成二维码的小程序 步骤四:填写页 ...

  8. Zxing图片识别 从相册选二维码图片解析总结

    Zxing图片识别 从相册选取二维码图片进行解析总结 在Zxing扫描识别和图片识别的解析对象是相同的 本文分三个步骤: 1 获取相册的照片 2 解析二维码图片 3 返回结果 1) 获取相册照片 go ...

  9. IOS手机长按图片无法弹出识别二维码

    在 h5 中长按图片二维码会弹出识别结果,有保存.分享.以及二维码中包含的跳转链接等,会引导我们点击跳转.当小程序中使用 web-view 嵌套时,该图片亦能长按识别. 以上功能在安卓上没有问题,但是 ...

最新文章

  1. 朴素、Select、Poll和Epoll网络编程模型实现和分析——Poll模型
  2. Salesforce Lightning开发学习(二)Component组件开发实践
  3. 短信升级为5G消息?三大运营商联合发布的《5G消息白皮书》说了啥?
  4. JavaScript 的使用简单总结
  5. java pashone_java – 如何使用onejar Maven插件在清单中设置附加的Class-Path条目?
  6. spring的有状态BEAN和无状态BEAN
  7. webuploader+PHP实现超大文件分片上传的功能
  8. python基本算法语句_Python中基本且又常用的算法
  9. linux笔记之 开机服务启动的控制,系统日志的查看,防火墙的关闭
  10. java 3number_java 数据Number、Math
  11. Java元数据总结:Java注释的使用和定义
  12. [MVC.NET] Asp.Net MVC3 简单入门第一季
  13. PyTorch 1.0 中文文档:torch.utils.data
  14. 亚洲诚信亮相2018天翼智能生态博览会
  15. python 爬虫基础(一)Beautifulsoup基础介绍
  16. linux7.4邮件服务器,Centos7.4搭建邮件收发服务器(部署篇)
  17. 单片机音频谱曲软件_单片机谱曲软件讲解
  18. csdn七牛云存储作为网站的图片外链
  19. 如何把路由器设置为交换机模式来使用
  20. 博客文章分类导引(持续更新)

热门文章

  1. 3D检测入门 - KITTI数据集
  2. 中国汉字在编排设计上的一些问题
  3. ps教程网教你新建画布
  4. C++设计模式 - 备忘录模式(Memento)
  5. 西梅干进口关税税率及进口注意事项
  6. 国培 计算机远程培训心得,国培网络研修心得体会(通用4篇)
  7. AI摄影,华为P20 Pro让每一拍都是大片
  8. A16z合伙人:为什么“边玩边赚”模式可行,链游与传统游戏如何相互借鉴?
  9. 华为C8650+升级电信定制版失败
  10. VBA 简单破解EXCEL工作簿数字密码的功能