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、生成二维码

好了,我们来实现一下

  1. /**
  2. *
  3. * @param width 二维码的宽
  4. *
  5. * @param height 二维码的高
  6. *
  7. * @param content 二维码的内容
  8. *
  9. */
  10. public static void createQrCode(int width, int height, String content) {
  11. // 1、设置二维码的一些参数
  12. HashMap hints = new HashMap();
  13. // 1.1设置字符集
  14. hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
  15. // 1.2设置容错等级;因为有了容错,在一定范围内可以把二维码p成你喜欢的样式
  16. hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
  17. // 1.3设置外边距;(即白色区域)
  18. hints.put(EncodeHintType.MARGIN, 1);
  19. // 2、生成二维码
  20. try {
  21. // 2.1定义BitMatrix对象
  22. BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
  23. // 2.2、设置二维码存放路径,以及二维码的名字
  24. Path codePath = new File("c:/Users/admin/Desktop/code/" + UUID.randomUUID() + ".png").toPath();
  25. // 2.3、执行生成二维码
  26. MatrixToImageWriter.writeToPath(bitMatrix, "png", codePath);
  27. } catch (Exception e) {
  28. // TODO Auto-generated catch block
  29. e.printStackTrace();
  30. }
  31. }
我们来实现一下带logo的二维码
思路:

1、 我们先生成一个LogoConfig的配置类,主要是设置logo边框颜色;logo边框宽度;logo大小

2、 设置一些二维码的参数

3、 生成二维码

4、 生成带logo的二维码

我们来实现一下

LogoConfig类
  1. class LogoConfig {
  2. // logo默认边框颜色
  3. public static final Color DEFAULT_BORDERCOLOR = Color.WHITE;
  4. // logo默认边框宽度
  5. public static final int DEFAULT_BORDER = 2;
  6. // logo大小默认为照片的1/6
  7. public static final int DEFAULT_LOGOPART = 6;
  8. private final int border = DEFAULT_BORDER;
  9. private final Color borderColor;
  10. private final int logoPart;
  11. public LogoConfig() {
  12. this(DEFAULT_BORDERCOLOR, DEFAULT_LOGOPART);
  13. }
  14. public LogoConfig(Color borderColor, int logoPart) {
  15. this.borderColor = borderColor;
  16. this.logoPart = logoPart;
  17. }
  18. public Color getBorderColor() {
  19. return borderColor;
  20. }
  21. public int getBorder() {
  22. return border;
  23. }
  24. public int getLogoPart() {
  25. return logoPart;
  26. }
  27. }
生成中间有logo的二维码的工具函数
  1. /**
  2. * 生成中间有logo的二维码
  3. *
  4. * @param width
  5. * @param height
  6. * @param content
  7. */
  8. public static void createLogoQrCode(int width, int height, String content) {
  9. // 1、设置二维码的一些参数
  10. HashMap hints = new HashMap();
  11. // 1.1设置字符集
  12. hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
  13. // 1.2设置容错等级;因为有了容错,在一定范围内可以把二维码p成你喜欢的样式
  14. hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
  15. // 1.3设置外边距;(即白色区域)
  16. hints.put(EncodeHintType.MARGIN, 1);
  17. // 2、生成二维码
  18. try {
  19. // 2.1定义BitMatrix对象
  20. BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
  21. // 2.2、设置二维码存放路径,以及二维码的名字
  22. // qrFile用来存放生成的二维码图片
  23. File qrFile = new File("c:/Users/admin/Desktop/code", UUID.randomUUID() + ".jpg");
  24. // logoFile用来存放带有logo的二维码图片
  25. File logoFile = new File("c:/Users/admin/Desktop/code", "test.jpg");
  26. // 2.3、执行生成二维码
  27. MatrixToImageWriter.writeToPath(bitMatrix, "jpg", qrFile.toPath());
  28. // 2.4在二维码中添加logo
  29. LogoConfig logoConfig = new LogoConfig();
  30. addLogo(qrFile, logoFile, logoConfig);
  31. } catch (Exception e) {
  32. // TODO Auto-generated catch block
  33. e.printStackTrace();
  34. }
  35. }
添加logo的工具类
  1. /**
  2. *
  3. * @param qrPic 二维码文件路径
  4. * @param logoPic logo文件路径
  5. * @param logoConfig 配置类
  6. */
  7. private static void addLogo(File qrPic, File logoPic, LogoConfig logoConfig) {
  8. if (!qrPic.isFile() || !logoPic.isFile()) {
  9. System.out.println("file not found!");
  10. System.exit(0);
  11. }
  12. try {
  13. // 1、读取二维码图片,并构建绘图对象
  14. BufferedImage image = ImageIO.read(qrPic);
  15. Graphics2D graph = image.createGraphics();
  16. // 2、读取logo图片
  17. BufferedImage logo = ImageIO.read(logoPic);
  18. int widthLogo = image.getWidth() / logoConfig.getLogoPart();
  19. int heightLogo = image.getHeight() / logoConfig.getLogoPart();
  20. // 3、计算图片放置的位置
  21. int x = (image.getWidth() - widthLogo) / 2;
  22. int y = (image.getHeight() - heightLogo) / 2;
  23. // 4、绘制图片
  24. graph.drawImage(logo, x, y, widthLogo, heightLogo, null);
  25. graph.drawRoundRect(x, y, widthLogo, heightLogo, 10, 10);
  26. graph.setStroke(new BasicStroke(logoConfig.getBorder()));
  27. graph.setColor(logoConfig.getBorderColor());
  28. graph.drawRect(x, y, widthLogo, heightLogo);
  29. graph.dispose();
  30. ImageIO.write(image, "jpeg", new File("C:/Users/admin/Desktop/code/newPic.jpg"));
  31. } catch (Exception e) {
  32. System.out.println(e);
  33. }
  34. }

我们写一个测试类来测试一下

  1. @Test
  2. public void test() {
  3. QrCodeUtils.createQrCode(100, 100, "你好,世界");
  4. QrCodeUtils.readQrCode("C:\\Users\\admin\\Desktop\\code\\4ad3a0a4-8d5c-4cd3-9ee5-5f680233a33f.png");
  5. QrCodeUtils.createLogoQrCode(300, 300, "https://www.jianshu.com/u/f84a2d49420b");
  6. QrCodeUtils.readQrCode("C:\\Users\\admin\\Desktop\\code\\newPic.jpg");
  7. }

我就不放生成好的二维码了,大家可以自己试试

我们补充一个读取二维码内容的工具函数

  1. /**
  2. * 解析二维码
  3. *
  4. * @param codePath 二维码存放全路径
  5. *
  6. */
  7. public static void readQrCode(String codePath) {
  8. try {
  9. MultiFormatReader formatReader = new MultiFormatReader();
  10. File QrCode = new File(codePath);
  11. BufferedImage image = ImageIO.read(QrCode);
  12. BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(image)));
  13. // 设置二维码的参数
  14. HashMap hints = new HashMap();
  15. hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
  16. Result result = formatReader.decode(binaryBitmap, hints);
  17. // 打印解析结果
  18. System.out.println(result.toString());
  19. // 打印二维码格式
  20. System.out.println(result.getBarcodeFormat());
  21. // 二维码文本内容
  22. System.out.println(result.getText());
  23. } catch (Exception e) {
  24. System.out.println(e);
  25. }
  26. }

注:二维码是有一定纠错能力的,你可以把二维码p成你喜欢的样式

Java实现带logo的二维码的更多相关文章

  1. java生成带logo的二维码,自定义大小,logo路径取服务器端

    package com.qishunet.eaehweb.util; import java.awt.BasicStroke; import java.awt.Graphics; import jav ...

  2. JAVA生成带Logo的二维码

    1.下载生成二维码所需要的jar包qrcode.jar: 2.直接上生成二维码的java代码 //需要导入的包 import java.awt.Color;import java.awt.Graphi ...

  3. Java生成带logo 的二维码

    这个工具类主要实现了两点功能: 1. 生成任意文链接的二维码. 2. 在二维码的中间加入图像. 主要实现步骤: 第一步: 导入QR二维码3.0 版本的core包和一张jpg图片(logo). core ...

  4. C#生成带logo的二维码

    带logo的二维码生成分为两步骤:首先根据输入的内容生成二维码图片,然后读取本地的logo图片,通过图片处理生成带logo的二维码. 生成的二维码效果如下: 下面直接贴出二维码生成类   QRCode ...

  5. .NET生成带Logo的二维码

    使用ThoughtWorks.QRCode生成,利用这个库来生成带Logo的二维码(就是中间嵌了一个图片的二维码),直接见代码: HttpContext context = HttpContext.C ...

  6. 制作、解析带logo的二维码

    用DecoderQRCode来解析带logo的二维码,发现报错,解析不了,于是便又查资料,找到了更强大的制作二维码 工具:GooleZXing 首先下GooleZXing的jar包. -------- ...

  7. C# ZXing.Net生成二维码、识别二维码、生成带Logo的二维码(二)

    1.使用ZXint.Net生成带logo的二维码 /// <summary> /// 生成带Logo的二维码 /// </summary> /// <param name ...

  8. 生成二维码、条形码、带logo的二维码

    Nuget安装ZXing.Net,帮助类: using System; using System.Collections.Generic; using System.Drawing; using Sy ...

  9. jQuery-qrcode.js 生成带Logo 的二维码

    引入文件  jQuery-qrcode.js 地址:https://blog-static.cnblogs.com/files/kitty-blog/jquery-qrcode.js https:// ...

随机推荐

  1. 剑指offer(62)二叉搜索树的第K个节点

    题目描述 给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8)    中,按结点数值大小顺序第三小结点的值为4. 题目分析 首先,我们可以先画图.画完图后我们要想办法从 ...

  2. Learning-Python【5】:Python数据类型(1)—— 整型、浮点型、字符串

    一.整型 1.用途:记录年龄.等级.各种号码等 2.定义方式 age = 22 只能将纯数字的字符串转换成整型 3.常用操作+内置方法 赋值运算.比较运算.算数运算 该类型总结: 存一个值 不可变(可 ...

  3. spark streaming将处理结果存入mysql中(使用c3p0连接池)

    1.c3p0相应的架包导入工程中 将以下四个架包导入工程, 主要有三个架包:c3p0-0.9.5.2.jar c3p0-oracle-thin-extras-0.9.5.2.jar mchange-c ...

  4. HashMap 和 HashTable差别

    代码版本 JDK每一版本都在改进.本文讨论的HashMap和HashTable基于JDK 1.7.0_67.源码见这里 1. 时间 HashTable产生于JDK 1.1,而HashMap产生于JDK ...

  5. Hadoop启动之后jps没有NameNode节点

    这是因为多次格式化namenode节点出现的问题 1.先运行stop-all.sh 2.删除原目录,即core-site.xml下配置的<name>hadoop.tmp.dir</n ...

  6. Android24以上拍照代码

    public void takePic(){ //创建File对象,用于存储拍照后的照片 File outputImage = new File(getExternalCacheDir()," ...

  7. HTTP安全通信:Https和SSL

    1. HTTPS概念 1)简介 HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HT ...

  8. Loadrunner加密算法脚本与token作为get请求url上的参数处理

    1.当字符串被封装好加密时(下例将算法封装在md5中),使用Loadrunner编写脚本,需要进行如下操作:       1)将md5.h文件添加到Extra Files 下,如图(Loadrunne ...

  9. vsto-Word相关操作

    //添加页码到页脚 Document doc = Globals.ThisAddIn.Application.ActiveDocument; HeaderFooter hprimary= doc.Se ...

  10. xftp免费版使用

    转自https://www.jb51.net/softs/621774.html