Java生成二维码
时间:2019-11-28
本文章向大家介绍Java生成二维码,主要包括Java生成二维码使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
转载: https://www.cnblogs.com/codingcc1/p/11099788.html
https://blog.csdn.net/wjs040/article/details/91452293
<dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.4.0</version> </dependency> <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.3.1</version> </dependency>
package com.jsy.demo.utils; import java.awt.image.BufferedImage; import java.io.File; import java.util.HashMap; import java.util.Hashtable; import java.util.Map; import javax.imageio.ImageIO; import com.google.zxing.BarcodeFormat; import com.google.zxing.Binarizer; import com.google.zxing.BinaryBitmap; 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.client.j2se.BufferedImageLuminanceSource; import com.google.zxing.common.BitMatrix; import com.google.zxing.common.HybridBinarizer; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; public class ZXingUtil { private static final int BLACK = 0xFF000000;//颜色 private static final int WHITE = 0xFFFFFFFF; //背景色 /** * * @param imgPath: 本地图片路径 * @param format: 图片类型 * @param content: 二维码内容 * @param width: 宽度 * @param height: 高度 * @param logo: logo路径 * @throws Exception */ public static void encodeImg(String imgPath,String format,String content,int width,int height,String logo) throws Exception { Hashtable<EncodeHintType,Object > hints = new Hashtable<EncodeHintType,Object>() ; //排错率 L<M<Q<H hints.put( EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H) ; //编码 hints.put( EncodeHintType.CHARACTER_SET, "utf-8") ; //外边距:margin hints.put( EncodeHintType.MARGIN, 1) ; /* * content : 需要加密的 文字 * BarcodeFormat.QR_CODE:要解析的类型(二维码) * hints:加密涉及的一些参数:编码、排错率 */ BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE,width,height, hints); //内存中的一张图片:此时需要的图片 是二维码-> 需要一个boolean[][] ->BitMatrix 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)? BLACK:WHITE) ); } } //画logo image = LogoUtil.logoMatrix(image, logo) ; //string->file File file = new File(imgPath); //生成图片 ImageIO.write(image, format, file); } //解密:二维码->文字 public static void decodeImg(File file) throws Exception { if(!file.exists()) return ; //file->内存中的一张图片 BufferedImage imge = ImageIO.read(file) ; MultiFormatReader formatReader = new MultiFormatReader() ; LuminanceSource source = new BufferedImageLuminanceSource(imge); Binarizer binarizer = new HybridBinarizer(source); BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer); //图片 ->result Map map = new HashMap(); map.put(EncodeHintType.CHARACTER_SET, "utf-8") ; Result result = formatReader.decode(binaryBitmap ,map ) ; System.out.println("解析结果:"+ result.toString()); } }
package com.jsy.demo.utils; import javax.imageio.ImageIO; import java.awt.*; import java.awt.geom.Ellipse2D; import java.awt.geom.RoundRectangle2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class LogoUtil { //传入logo、二维码 ->带logo的二维码 public static BufferedImage logoMatrix( BufferedImage matrixImage,String logo ) throws IOException { //在二维码上画logo:产生一个 二维码画板 Graphics2D g2 = matrixImage.createGraphics(); //画logo: String->BufferedImage(内存) BufferedImage logoImg = ImageIO.read(new File(logo)); int height = matrixImage.getHeight(); int width = matrixImage.getWidth(); //纯logo图片 g2.drawImage(convertCircular(logoImg), width * 2 / 5, height * 2 / 5, width * 1 / 5, height * 1 / 5, null); //产生一个 画 白色圆角正方形的 画笔 BasicStroke stroke = new BasicStroke(5, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND); //将画板-画笔 关联 g2.setStroke(stroke); //创建一个正方形 //RoundRectangle2D.Float round = new RoundRectangle2D.Float(width * 2 / 5, height * 2 / 5, width * 1 / 5, height * 1 / 5, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND); //RoundRectangle2D.Float round = new RoundRectangle2D.Float(width * 2 / 5, height * 2 / 5, width * 1 / 5, height * 1 / 5, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND); //g2.setColor(Color.WHITE); //g2.draw(round); //灰色边框 BasicStroke stroke2 = new BasicStroke(1, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND); g2.setStroke(stroke2); //创建一个正方形 /*RoundRectangle2D.Float round2 = new RoundRectangle2D.Float(width * 2 / 5 + 2, height * 2 / 5 + 2, width * 1 / 5 - 4, height * 1 / 5 - 4, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND); Color color = new Color(128,128,128) ; g2.setColor(Color.GRAY); g2.draw(round2);*/ g2.dispose(); matrixImage.flush(); return matrixImage; } /** * 传入的图像必须是正方形的 才会 圆形 如果是长方形的比例则会变成椭圆的 * @param bi1 用户头像地址 * @return * @throws IOException */ public static BufferedImage convertCircular(BufferedImage bi1) throws IOException{ //这种是黑色底的 //BufferedImage bi2 = new BufferedImage(bi1.getWidth(),bi1.getHeight(),BufferedImage.TYPE_INT_RGB); //透明底的图片 BufferedImage bi2 = new BufferedImage(bi1.getWidth(),bi1.getHeight(),BufferedImage.TYPE_4BYTE_ABGR); Ellipse2D.Double shape = new Ellipse2D.Double(0,0,bi1.getWidth(),bi1.getHeight()); Graphics2D g2 = bi2.createGraphics(); g2.setClip(shape); g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // 使用 setRenderingHint 设置抗锯齿 g2.drawImage(bi1,0,0,null); //设置颜色 g2.setBackground(Color.green); g2.dispose(); return bi2; } }
package com.jsy.demo; import java.io.File; import com.jsy.demo.utils.ZXingUtil; public class test { public static void main(String[] args) throws Exception { String imgPath = "src/二维码test6.png"; String content = "http://my9wby.natappfree.cc/index.html"; String logo = "src/logo.png"; //加密:文字信息->二维码 ZXingUtil.encodeImg(imgPath, "png",content, 300, 300,logo); //解密:二维码 ->文字信息 ZXingUtil.decodeImg(new File(imgPath)); } }
注意: 如果要内嵌图片的话,尽量选取高清图片,不然很模糊!
原文地址:https://www.cnblogs.com/yxgmagic/p/11950336.html
- 解决WordPress4.4.1不支持图片暗箱问题,Begin主题适用
- MySQL源码安装总结(r12笔记第12天)
- 全站启用SSL之后,如何兼容不支持https抓取的搜索引擎?
- sandbox和MHA快速测试(r12笔记第32天)
- 分享一个支持https的CDN及启用SSL后续问题汇总
- 分分钟搭建MySQL一主多从环境(r12笔记第31天)
- 相同update语句在MySQL,Oracle的不同表现(r12笔记第30天)
- 升级Nginx1.9.5以上版本,开启博客网站http2.0时代
- Oracle Data Guard压缩归档测试(二)(r12笔记第27天)
- Oracle Data Guard压缩归档效果对比(r12笔记第26天)
- PHP7.0正式版编译安装升级及WordPress问题解决分享
- MySQL自增列的重复值问题(r12笔记第25天)
- 借助腾讯云CDN开启全站https及问题解决分享
- 分分钟搭建MySQL Group Replication测试环境(二)(r12笔记第41天)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 初学者也能快速写Python脚本啦——通用功能代码分享
- C++核心准则CPL.1:C++比C更好
- C++核心准则CPL.2:如果你必须使用C,使用C和C++的共同子集,并且使用C++编译器编译C代码
- C++核心准则SF.1:如果你的项目没有正在遵从的其他习惯,为代码文件使用.cpp后缀,为接口文件使用.h后缀
- 群晖NAS搭建测速网站,支持万兆
- 二叉树:你真的会翻转二叉树么?
- C++核心准则SF.2:.h文件一定不能包含对象定义或者非inline函数定义
- Vue.js 源码⽬录设计
- 本周小结!(二叉树)
- extern "c"(2)
- Mysql 触发器基础
- C++核心准则SF.3:使用.h文件管理所有在多个源文件中使用的声明
- 秋招面经一(蚂蚁、招银)
- php基础之Trait
- 秋招面经五(字节、拼多多、美团、网易)