title: Java实现二维码生成

categories: “Java”


前言

日前生活上存在很多扫描二维码的场景,支付、加好友…等操作都需要扫描二维码,然后我就在想Java能不能实现二维码的生成呢?百度一搜,还是有的,看了一些,决定自己试试看,所以下面是我用Java代码写的二维码实现,但是弊端就是只能在个人pc电脑上生成,没有写成一个完整的网页小功能,我想下一章博客,我会写写的。

准备工作

1.首先你得在个人pc安装Java环境。这个百度一搜,都有的,我就不写了。

2.编程环境安装好了,你得有一个好玩的编辑器软件,建议使用IntelliJ IDEA ,这个博客使用的编程编辑器,我是使用eclipse的,没想到吧,哈哈。

3.Java其实是提供了一个库来实现二维码的生成的,就是这个core-3.0.0.jar,网站我忘了,但我可以提供一下我使用的这个jar包,链接:链接:https://pan.baidu.com/s/1EjSbBfhGyWzTWNynT6lNWA
提取码:vc0h

4.下载了core-3.0.0.jar包,然后引进项目。如何在eclipse新建Java probject中引入jar包,这个我在这里就不详细说明了,请自行百度吧。

开始

1.新建工程项目,引入core-3.0.0.jar包后,新建一个名为BufferedImageLuminanceSource.java类

—Java

import java.awt.BasicStroke;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Shape;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.OutputStream;
import java.util.Hashtable;
import java.util.Random;import javax.imageio.ImageIO;import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.EncodeHintType;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.Result;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;public class BufferedImageLuminanceSource {private static final String CHARSET = "utf-8";private static final String FORMAT_NAME = "JPG";// 二维码尺寸private static final int QRCODE_SIZE = 300;// LOGO宽度private static final int WIDTH = 60;// LOGO高度private static final int HEIGHT = 60;public BufferedImageLuminanceSource(BufferedImage image) {// TODO Auto-generated constructor stub}private static BufferedImage createImage(String content, String imgPath,boolean needCompress) throws Exception {Hashtable hints = new Hashtable();hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);hints.put(EncodeHintType.CHARACTER_SET, CHARSET);hints.put(EncodeHintType.MARGIN, 1);BitMatrix bitMatrix = new MultiFormatWriter().encode(content,BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, hints);int width = bitMatrix.getWidth();int height = bitMatrix.getHeight();BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);for (int x = 0; x < width; x++) {for (int y = 0; y < height; y++) {image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000: 0xFFFFFFFF);}}if (imgPath == null || "".equals(imgPath)) {return image;}// 插入图片BufferedImageLuminanceSource.insertImage(image, imgPath, needCompress);return image;}private static void insertImage(BufferedImage source, String imgPath,boolean needCompress) throws Exception {File file = new File(imgPath);if (!file.exists()) {System.err.println(""+imgPath+"   该文件不存在!");return;}Image src = ImageIO.read(new File(imgPath));int width = src.getWidth(null);int height = src.getHeight(null);if (needCompress) { // 压缩LOGOif (width > WIDTH) {width = WIDTH;}if (height > HEIGHT) {height = HEIGHT;}Image image = src.getScaledInstance(width, height,Image.SCALE_SMOOTH);BufferedImage tag = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);Graphics g = tag.getGraphics();g.drawImage(image, 0, 0, null); // 绘制缩小后的图g.dispose();src = image;}// 插入LOGOGraphics2D graph = source.createGraphics();int x = (QRCODE_SIZE - width) / 2;int y = (QRCODE_SIZE - height) / 2;graph.drawImage(src, x, y, width, height, null);Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);graph.setStroke(new BasicStroke(3f));graph.draw(shape);graph.dispose();}public static void encode(String content, String imgPath, String destPath,boolean needCompress) throws Exception {BufferedImage image = BufferedImageLuminanceSource.createImage(content, imgPath,needCompress);mkdirs(destPath);String file = new Random().nextInt(99999999)+".jpg";ImageIO.write(image, FORMAT_NAME, new File(destPath+"/"+file));}public static void mkdirs(String destPath) {File file =new File(destPath);   //当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常)if (!file.exists() && !file.isDirectory()) {file.mkdirs();}}public static void encode(String content, String imgPath, String destPath)throws Exception {BufferedImageLuminanceSource.encode(content, imgPath, destPath, false);}public static void encode(String content, String destPath,boolean needCompress) throws Exception {BufferedImageLuminanceSource.encode(content, null, destPath, needCompress);}public static void encode(String content, String destPath) throws Exception {BufferedImageLuminanceSource.encode(content, null, destPath, false);}public static void encode(String content, String imgPath,OutputStream output, boolean needCompress) throws Exception {BufferedImage image = BufferedImageLuminanceSource.createImage(content, imgPath,needCompress);ImageIO.write(image, FORMAT_NAME, output);}public static void encode(String content, OutputStream output)throws Exception {BufferedImageLuminanceSource.encode(content, null, output, false);}public static String decode(File file) throws Exception {BufferedImage image;image = ImageIO.read(file);if (image == null) {return null;}Object source = new BufferedImageLuminanceSource(image);BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer((LuminanceSource) source));Result result;Hashtable hints = new Hashtable();hints.put(DecodeHintType.CHARACTER_SET, CHARSET);result = new MultiFormatReader().decode(bitmap, hints);String resultStr = result.getText();return resultStr;}public static String decode(String path) throws Exception {return BufferedImageLuminanceSource.decode(new File(path));}public static void main(String[] args) throws Exception {String text = "http://hongkaiqing.cn";BufferedImageLuminanceSource.encode(text, "d:/MyWorkDoc/my180.jpg", "d:/MyWorkDoc", true);}}

在创建一个命名为:QRCodeUtil.java类

—Java


import java.awt.BasicStroke;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Shape;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.OutputStream;
import java.util.Hashtable;
import java.util.Random;import javax.imageio.ImageIO;import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.EncodeHintType;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.Result;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;public class QRCodeUtil {private static final String CHARSET = "utf-8";private static final String FORMAT_NAME = "JPG";// 二维码尺寸private static final int QRCODE_SIZE = 300;// LOGO宽度private static final int WIDTH = 60;// LOGO高度private static final int HEIGHT = 60;private static BufferedImage createImage(String content, String imgPath,boolean needCompress) throws Exception {Hashtable hints = new Hashtable();hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);hints.put(EncodeHintType.CHARACTER_SET, CHARSET);hints.put(EncodeHintType.MARGIN, 1);BitMatrix bitMatrix = new MultiFormatWriter().encode(content,BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, hints);int width = bitMatrix.getWidth();int height = bitMatrix.getHeight();BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);for (int x = 0; x < width; x++) {for (int y = 0; y < height; y++) {image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000: 0xFFFFFFFF);}}if (imgPath == null || "".equals(imgPath)) {return image;}// 插入图片QRCodeUtil.insertImage(image, imgPath, needCompress);return image;}private static void insertImage(BufferedImage source, String imgPath,boolean needCompress) throws Exception {File file = new File(imgPath);if (!file.exists()) {System.err.println(""+imgPath+"   该文件不存在!");return;}Image src = ImageIO.read(new File(imgPath));int width = src.getWidth(null);int height = src.getHeight(null);if (needCompress) { // 压缩LOGOif (width > WIDTH) {width = WIDTH;}if (height > HEIGHT) {height = HEIGHT;}Image image = src.getScaledInstance(width, height,Image.SCALE_SMOOTH);BufferedImage tag = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);Graphics g = tag.getGraphics();g.drawImage(image, 0, 0, null); // 绘制缩小后的图g.dispose();src = image;}// 插入LOGOGraphics2D graph = source.createGraphics();int x = (QRCODE_SIZE - width) / 2;int y = (QRCODE_SIZE - height) / 2;graph.drawImage(src, x, y, width, height, null);Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);graph.setStroke(new BasicStroke(3f));graph.draw(shape);graph.dispose();}public static void encode(String content, String imgPath, String destPath,boolean needCompress) throws Exception {BufferedImage image = QRCodeUtil.createImage(content, imgPath,needCompress);mkdirs(destPath);String file = new Random().nextInt(99999999)+".jpg";ImageIO.write(image, FORMAT_NAME, new File(destPath+"/"+file));}public static void mkdirs(String destPath) {File file =new File(destPath);   //当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常)if (!file.exists() && !file.isDirectory()) {file.mkdirs();}}public static void encode(String content, String imgPath, String destPath)throws Exception {QRCodeUtil.encode(content, imgPath, destPath, false);}public static void encode(String content, String destPath,boolean needCompress) throws Exception {QRCodeUtil.encode(content, null, destPath, needCompress);}public static void encode(String content, String destPath) throws Exception {QRCodeUtil.encode(content, null, destPath, false);}public static void encode(String content, String imgPath,OutputStream output, boolean needCompress) throws Exception {BufferedImage image = QRCodeUtil.createImage(content, imgPath,needCompress);ImageIO.write(image, FORMAT_NAME, output);}public static void encode(String content, OutputStream output)throws Exception {QRCodeUtil.encode(content, null, output, false);}public static String decode(File file) throws Exception {BufferedImage image;image = ImageIO.read(file);if (image == null) {return null;}Object source = new BufferedImageLuminanceSource(image);BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer((LuminanceSource) source));Result result;Hashtable hints = new Hashtable();hints.put(DecodeHintType.CHARACTER_SET, CHARSET);result = new MultiFormatReader().decode(bitmap, hints);String resultStr = result.getText();return resultStr;}public static String decode(String path) throws Exception {return QRCodeUtil.decode(new File(path));}public static void main(String[] args) throws Exception {String text = "http://www.hongkaiqing.cn";QRCodeUtil.encode(text, "d:/MyWorkDoc", true);}}

然后运行QRCodeUtil.java类,就会在你个人pc电脑的d盘MyWorkDoc文件夹下生成一个二维码图片,效果如下:如果你个人pc电脑的d盘目录下没有MyWorkDoc文件夹,程序则会自动帮你生成该文件夹。

最后

其实是QRCodeUtil.java类中这个main方法决定程序在那个文件夹下生成二维码,String text 决定二维码扫描后,显示的内容的


 public static void main(String[] args) throws Exception {String text = "http://www.hongkaiqing.cn";QRCodeUtil.encode(text, "d:/MyWorkDoc", true);}

这个项目demo源码存放在GitHub上,链接:https://github.com/hongkq/QR-code

如有问题,欢迎联系18718383260@163.com

Java实现二维码生成相关推荐

  1. java实现二维码生成的几个方法

    java实现二维码生成的几个方法 分类: J2EE2013-06-13 20:32 10390人阅读 评论(1) 收藏 举报 1: 使用SwetakeQRCode在Java项目中生成二维码  http ...

  2. java实现二维码生成功能

    1.由来: 由于现在对二维码的使用比较多,正好我在项目里面也使用到了,所以写篇博客记录一下. 2.引入依赖: <dependency><groupId>com.google.z ...

  3. Java:二维码生成工具类

    java 二维码生成工具类 需要引入的maven <!--Java 生成二维码 --> <dependency><groupId>com.google.zxing& ...

  4. Java实现二维码生成与识别

    java实现QRCODE二维码的编码与解码实例 众所周知,爪哇,是一种神奇的编程语言,用JAVA 实现某一个功能,只是随便上网找一些对应的实现JAR包即可,于是,有了像JAR114这样专门提供给 爪哇 ...

  5. JAVA实现二维码生成加背景图

    应用场景:比如制作海报.宣传图时需要添加扫码关注的二维码 先上效果图 ( ≧▽≦ ) POM.XML <!-- 二维码生成 --><!-- https://mvnrepository ...

  6. java实现二维码生成及调用打印机打印

    在开发二维码打印的过程中走过几次弯路,所以在这里特意将其记录下来留作备忘.一开始参考其他博主写的文章,有介绍通过编写JAVA后台代码来获取本地默认打印机的驱动实现打印.BUT!这样就导致在本地开发测试 ...

  7. 【Java】二维码生成,QRcode

    QRcode jar包下载地址:http://swetake.com/qrcode/java/qr_java.html 解析的工具可以参考 zxing 代码如下 package erweima; im ...

  8. Java实现二维码生成 Google-Zxing

    本篇文章将介绍java中如何生成二维码,二维码的展示主要包括两各方面:1.直接生成图片(直接生成图片不需要web程序,maven工程即可) 2.将二维码转为字节数组,然后在web页面显示.web项目的 ...

  9. zxing 二维码生成深度定制

    二维码生成服务之深度定制 之前写了一篇二维码服务定制的博文,现在则在之前的基础上,再进一步,花样的实现深度定制的需求,我们的目标是二维码上的一切都是可以由用户来随意指定 设计 1. 技术相关 zxin ...

最新文章

  1. eclipse打开过的工程信息保存路径
  2. VTK:vtkAxisActor用法实战
  3. php oauth 扩展,PHP 安装 Oauth 扩展
  4. 《CCNP安全Secure 642-637认证考试指南》——第8章 配置与实施路由式数据面安全...
  5. php7如何安装swoole,PHP7如何安装Swoole?
  6. 前端学习(2589):前端权限的设计思路
  7. 中科院动物所团队揭示了空间种子传播集合网络的结构及功能维持机制
  8. 华硕无双新品首爆:H45标压处理器+全球首款2.8K 120Hz OLED屏
  9. 10月15日发布!谷歌Pixel 4系列或将全系支持5G
  10. python是什么编程语言-什么是编程语言,什么是Python解释器
  11. 计算机软件卡死,电脑运行慢,卡或软件卡死无响应的解决方法
  12. 2021-07-28 cad贱人工具箱5.8
  13. TRUNK 的介绍和配置
  14. Linux武侠文字游戏,怀旧的文字游戏,文字武侠手游哪个好玩?
  15. 卡西欧计算机怎么进制转换,casio计算器fx82es刷机实现十进制转其他进制的模式...
  16. 使用 className 修改样式属性
  17. 槛外人观察 :语义和语用
  18. Tablacus Explorer双心封装版
  19. 51单片机的蓝牙电子秤设计
  20. OSI七层模型和TCP/IP四层体系分层结构

热门文章

  1. android listview 不显示_Android使用ExpandableListview实现时间轴
  2. 软件工程复习提纲——第四章
  3. 深度优先搜索——单词接龙(洛谷 P1019)
  4. 异常掉电导致的ORA-[kfrValAcd30]故障处理
  5. 万字详解Docker架构原理、功能及使用
  6. 10倍,BoostKit鲲鹏全局缓存3大创新技术助力Ceph性能提升
  7. 带你深入理解Java的IO到底是个啥
  8. 云图说|一张图带你了解华为云分布式数据库中间件
  9. 业务爆发式增长,音视频服务如何做好质量监控与优化?
  10. 无码系列-2-代码架构空想