【Java 二维码】生成二维码
ZXingCodeEncodeUtils 生成及解析二维码项目
package utils; import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.InputStream;
import java.util.EnumMap; import javax.imageio.ImageIO; import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; /**
* 生成二维码
*/
public class ZXingCodeEncodeUtils { public static void main(String[] args) {
// createZXingCodeSaveToDisk("kikyo", 400, 400, "D:/kikyo.gif", "JPEG");
InputStream logoStream = ZXingCodeEncodeUtils.class.getClassLoader().getResourceAsStream("image/logo.jpg");
createZxingCodeUseLogoSaveToDisk("kikyo", 400, 400, "D:/kikyo.jpg", "JPEG", logoStream);
System.out.println("生成成功");
} // 二维码颜色
private static final int BLACK = 0xFF000000;
// 二维码背景颜色
private static final int WHITE = 0xFFFFFFFF; // 二维码格式参数
private static final EnumMap<EncodeHintType, Object> hints = new EnumMap<EncodeHintType, Object>(EncodeHintType.class); static {
/*
* 二维码的纠错级别(排错率),4个级别: L (7%)、 M (15%)、 Q (25%)、 H (30%)(最高H)
* 纠错信息同样存储在二维码中,纠错级别越高,纠错信息占用的空间越多,那么能存储的有用讯息就越少;共有四级; 选择M,扫描速度快。
*/
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
// 二维码边界空白大小 1,2,3,4 (4为默认,最大)
hints.put(EncodeHintType.MARGIN, 1);
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");// 设置放入的字符的编码
} /**
* 生成二维码保存到目标路径
*/
public static void createZXingCodeSaveToDisk(String content, int width, int height, String savePath, String imageType) {
try {
BufferedImage image = createZXingCodeNormal(content, width, height);
// 保存图片到硬盘
File file = new File(savePath);
if (!file.exists()) {
file.createNewFile();
}
ImageIO.write(image, imageType, file);
System.out.println("生成成功");
} catch (Exception e) {
e.printStackTrace();
}
} /**
* 生成二维码返回图片对象
*/
public static BufferedImage createZXingCodeNormal(String content, int width, int height) {
try {
BitMatrix encode = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
// 得到二维码的宽度
int code_width = encode.getWidth();
int code_height = encode.getHeight();
// 创建图片
BufferedImage image = new BufferedImage(code_width, code_height, BufferedImage.TYPE_INT_RGB);
// 把二维码里面的信息写到图片里面
for (int i = 0; i < code_width; i++) {
for (int j = 0; j < code_height; j++) {
image.setRGB(i, j, encode.get(i, j) ? BLACK : WHITE);
}
}
return image;
} catch (Exception e) {
e.printStackTrace();
return null;
}
} /**
* 生成一张带logo的二维码
*
* @param logoStream logo的流对象
*/
public static void createZxingCodeUseLogoSaveToDisk(String content, int width, int height, String savePath,
String imageType, InputStream logoStream) {
try {
BufferedImage codeImage = createZxingCodeUseLogo(content, width, height, logoStream);
// 保存图片到硬盘
File file = new File(savePath);
if (!file.exists()) {
file.createNewFile();
}
ImageIO.write(codeImage, imageType, file);
} catch (Exception e) {
e.printStackTrace();
}
} /**
* 生成一张带logo的二维码 返回BuffredeImage
*
* @param logoStream logo的流对象
*/
public static BufferedImage createZxingCodeUseLogo(String content, int width, int height, InputStream logoStream) {
try {
//生成二维码图片
BufferedImage codeNormal = createZXingCodeNormal(content, width, height);
//判断logoStream是否为空
if (null == codeNormal || null == logoStream) {
System.out.println("codeNormal or logoStream is null");
return null;
}
//拿到可以操作当前图片的画笔
Graphics2D graphics = codeNormal.createGraphics();
//得到logo图片的对象
BufferedImage logoImage = ImageIO.read(logoStream);
//得到logo的原始宽高
int old_logo_width = logoImage.getWidth();
int old_logo_height = logoImage.getHeight(); //得到二维码的宽高
int code_width = codeNormal.getWidth();
int code_height = codeNormal.getHeight(); //算出logo在二维码里面能存在的最大值
int logo_max_width = code_width / 5;
int logo_max_height = code_height / 5; //计算logo的可用宽高
int logo_width = logo_max_width < old_logo_width ? logo_max_width : old_logo_width;
int logo_height = logo_max_height < old_logo_height ? logo_max_height : old_logo_height; //计算logo的开始点的坐标
int x = (code_width - logo_width) / 2;
int y = (code_height - logo_height) / 2; /**
* logoImage logo图片对象
* x 开始画的x轴坐标
* y 开始画的y轴的坐
* logo_width 要画的x轴的长度
* logo_height 要画的y车的长度
* arg5 null
*/
graphics.drawImage(logoImage, x, y, logo_width, logo_height, null); graphics.setStroke(new BasicStroke(2));
graphics.setColor(Color.WHITE);
//画白色边框
graphics.drawRoundRect(x, y, logo_width, logo_height, 15, 15);
graphics.dispose();//让画上的去的内容生效
return codeNormal;
} catch (Exception e) {
e.printStackTrace();
System.out.println("生成失败 " + e.getMessage());
return null;
}
}
}
ZXingCodeDecodeUtils
package utils; import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.EnumMap; import javax.imageio.ImageIO; import com.google.zxing.Binarizer;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.HybridBinarizer; /**
* 解析二维码
*/
public class ZXingCodeDecodeUtils { public static void main(String[] args) throws FileNotFoundException {
// String string = decodeCodeFile("D:/kikyo.gif");
String string = decodeCodeStream(new FileInputStream(new File("D:/kikyo.jpg")));
System.out.println(string);
} // 二维码格式参数
private static final EnumMap<DecodeHintType, Object> decodeHints = new EnumMap<DecodeHintType, Object>(DecodeHintType.class); static {
decodeHints.put(DecodeHintType.CHARACTER_SET, "UTF-8");
} /**
* 解析文件
*/
public static String decodeCodeFile(String path) {
File file = new File(path);
if (!file.exists())
return null;
// 把文件转成图片对象
try {
String content = decodeCodeStream(new FileInputStream(file));
return content;
} catch (Exception e) {
e.printStackTrace();
return null;
}
} /**
* 解析流
*/
public static String decodeCodeStream(InputStream inputStream) {
if (null == inputStream)
return null;
try {
BufferedImage image = ImageIO.read(inputStream);
LuminanceSource source = new BufferedImageLuminanceSource(image);
Binarizer binarizer = new HybridBinarizer(source);
BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);
MultiFormatReader reader = new MultiFormatReader();
Result result = reader.decode(binaryBitmap, decodeHints);
String content = result.getText();
return content;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
CodeServlet
@WebServlet("/code.action")
public class CodeServlet extends HttpServlet {
private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
} protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//生成图片
// BufferedImage codeImage=ZXingCodeEncodeUtils.createZXingCodeNormal("kikyo", 300, 300);
InputStream logoStream = this.getClass().getClassLoader().getResourceAsStream("/image/logo.jpg");
BufferedImage codeImage = ZXingCodeEncodeUtils.createZxingCodeUseLogo("kikyo", 300, 300, logoStream); ServletOutputStream outputStream = response.getOutputStream();
ImageIO.write(codeImage, "JPEG", outputStream);
outputStream.close();
}
}
DeCodeServlet
@WebServlet("/decode.action")
@MultipartConfig
public class DeCodeServlet extends HttpServlet {
private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
} protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Part part = request.getPart("mf");
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
String string = ZXingCodeDecodeUtils.decodeCodeStream(part.getInputStream());
PrintWriter out = response.getWriter();
out.write(string);
out.flush();
out.close();
}
}
index.jsp
<img alt="" src="code.action" >
<form action="decode.action" method="post" enctype="multipart/form-data">
<input type="file" name="mf">
<input type="submit" value="解析">
</form>
pom.xml
<!-- servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency> <!-- ZXing -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.3</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.3.3</version>
</dependency>
【Java 二维码】生成二维码的更多相关文章
- java小技术之生成二维码
把我们需要的链接或者内容生成二维码其实是一件非常容易的事情,有很多办法可以实现,这里我们采用JS方法生成. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTM ...
- 【java工具类】生成二维码
/** * 生成二维码图片 * @param text 扫描二维码后跳转的url * @param width 图片宽度 * @param height 图片高度 * @param filePath ...
- HTML5实现扫描识别二维码/生成二维码
扫描识别二维码 思路: 1. 操作摄像头,获取图片.HTML5 WEBRTC的navigator.getUserMedia方法去实时获取摄像头资源. 2. 利用canvas使用相关算法分析图片识别图 ...
- iOS中 扫描二维码/生成二维码详解 韩俊强的博客
最近大家总是问我有没有关于二维码的demo,为了满足大家的需求,特此研究了一番,希望能帮到大家! 每日更新关注:http://weibo.com/hanjunqiang 新浪微博 指示根视图: se ...
- iOS中 扫描二维码/生成二维码具体解释 韩俊强的博客
近期大家总是问我有没有关于二维码的demo,为了满足大家的需求,特此研究了一番,希望能帮到大家! 每日更新关注:http://weibo.com/hanjunqiang 新浪微博 指示根视图: se ...
- iOS雪花动画、音频图、新闻界面框架、2048游戏、二维码条形码扫码生成等源码
iOS精选源码 粒子雪花与烟花的动画 iOS 2048游戏 JHSoundWaveView - 简单地声波图.音波图 一个可快速集成的新闻详情界面框架,类似今日头条,腾讯新闻 二维码/条形码扫描及扫描 ...
- Java二维码生成与解码
基于google zxing 的Java二维码生成与解码 一.添加Maven依赖(解码时需要上传二维码图片,所以需要依赖文件上传包) <!-- google二维码工具 --> &l ...
- java 生成二维码、可带LOGO、可去白边
1.准备工作 所需jar包: JDK 1.6: commons-codec-1.11.jar core-2.2.jar javase-2.2.jar JDK 1.7: commons-codec- ...
- java后台中处理图片辅助类汇总(上传图片到服务器,从服务器下载图片保存到本地,缩放图片,copy图片,往图片添加水印图片或者文字,生成二维码,删除图片等)
最近工作中处理小程序宝箱活动,需要java画海报,所以把这块都快百度遍了,记录一下处理的方法,百度博客上面也有不少坑! 获取本地图片路径: String bgPath = Thread.current ...
- 通过jquery-qrcode在线生成二维码
随着移动互联网的发展,二维码现在应用得越来越广泛了,随手扫扫就可以浏览网站.加个好友什么的,比起手工输入真的是方便太多了. 前期做了一个综合测评系统,考虑逐步实现移动化,一长串的IP地址用户输入也不方 ...
随机推荐
- threading 官方 线程对象和锁对象以及条件对象condition
官方地址:https://docs.python.org/2/library/threading.html#thread-objects 以下只截取condition部分,其他Lock()以及thre ...
- 对象析构谈—— delete this 的使用及注意事项
this对象是必须是用 new操作符分配的(而不是用new[],也不是用placement new,也不是局部对象,也不是global对象): delete this后,不能访问该对象任何的成员变量及 ...
- WSAGetLastError错误原因的博客与时间函数
https://blog.csdn.net/skc361/article/details/9254507 https://blog.csdn.net/HK_5788/article/details/4 ...
- CTF_论剑场 头像
首先打开链接发现这个链接是一个头像 然后下载这个头像 通过hxd分析一下 在编辑中查找 flag 然后发现flag是一个用base64 加密的一串文字 然后我们将这串文字 解密 然后再通过md5 32 ...
- 关于Spring+mybatis使用@Transactional注解事物没有生效的问题
控制台日志信息: was not registered for synchronization because synchronization is not active JDBC Connectio ...
- [Reversal 剧情设计] 设定
在正式写之前,先交代一些设定,便于后续的展开.先在这里说明一点,我的文笔可能很烂(因为在写小说方面还没有得到过别人的评价),只要你们能体会我想表达的东西就行(不过也的确是这样,如果作者构筑得过于详细, ...
- 实体间的关系:1:1,1:N,M:N
*实体之间的关系* 1)1对1关系: 两个实体表内,存在相同的主键字段. 1.1)设计: 如果记录的主键值等于另一个关系表内记录的主键值,则两条 记录对应,1:1对应. 例子: #表一:学生信息表 # ...
- Java的JAVA_HOME、Path、CLASSPATH环境变量小结,可以借助这三个的配置去理解Oracle中的那几个环境变量的配置作用
问题:在哪里都能执行java命令,是和JAVA_HOME变量有关系呢还是path中指定的那个java路径呢?? 刚学Java的时候,很多jdk配置教程都要求设置JAVA_HOME.Path.CLASS ...
- CentOS7中Tomcat的安装和配置以及启动配置tomcat。启动过程中的易错点
Tomcat运行需要设置JRE目录,全局变量配置,请参见: Linux下JDK的安装和配置 当然也可以直接修改Tomcat的配置文件,请自行度娘 1.下载并解压 请先去官网找到需要下载的tom ...
- Vue-路由跳转的几种方式和路由重定向
一.标签路由 router-link 注意:router-link中链接如果是'/'开始就是从根路由开始,如果开始不带'/',则从当前路由开始. 1.不传参 <router-link :to=& ...