JavaWeb 二维码
说明
相关包
zxing-core3.3
zxing-javase3.3
junit4.12
POM文件
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
相关代码
package com;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;
import javax.imageio.ImageIO;
import org.junit.Test;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.Binarizer;
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.NotFoundException;
import com.google.zxing.Result;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.client.j2se.MatrixToImageConfig;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.oned.Code128Writer;
public class Demo {
static class ImageFormat {
static final String PNG = "png";
static final String GIF = "gif";
static final String BMP = "bmp";
static final String JPEG = "jpeg";
}
@Test
public void qrcodeBuildTest() {
// 输出目录
String outPath = "d:\\demo\\";
// 输出文件名
String outName = "zxingDemo.png";
// 生成内容
String contents = "Qrcode Demo";
Demo.qrCodeBuild(contents, outPath, outName, ImageFormat.PNG, 200, 200);
}
@Test
public void barCodeBuildTest() {
// 输出目录
String outPath = "d:\\demo\\";
// 输出文件名
String outName = "zxingDemo.png";
// 生成内容
String contents = "barCode Demo";
Demo.barCodeBuild(contents, outPath, outName, ImageFormat.PNG, 180, 60);
}
@Test
public void qrCodeParseTest() {
// String content = Demo.qrcodeParse("d:\\demo\\zxingDemo.png");
String content = Demo.qrcodeParse(
"http://dl2.iteye.com/upload/attachment/0103/0259/f1c4cf6c-c825-3504-8c9e-97019e3796d1.png");
System.out.println(null == content ? "解析失败" : content);
}
/**
* 二维码生成
*
* @param contents
* 文本内容
* @param outPath
* 输出目录
* @param outName
* 输出文件
* @param format
* 输出文件类型(png,jpeg...)
* @param width
* 生成图片宽度
* @param height
* 生成图片高度
*/
public static void qrCodeBuild(String contents, String outPath, String outName, String format, int width,
int height) {
try {
// 输出目录检测
if (!new File(outPath).exists()) {
new File(outPath).mkdirs();
}
Path path = FileSystems.getDefault().getPath(outPath, outName);
// 相关配置(编码、白边)
Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
hints.put(EncodeHintType.MARGIN, 1);
// 生成
BitMatrix matrix = new MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE, width, height, hints);
// 输出二维码
MatrixToImageConfig config = new MatrixToImageConfig(0xFF000000, 0xFFFFFFFF);
MatrixToImageWriter.writeToPath(matrix, format, path, config);
// 输出为文件流(Web项目)
// OutputStream stream = response.getOutputStream();
// MatrixToImageWriter.writeToStream(matrix, format, stream,config);
System.out.println("调试输出:OK");
} catch (WriterException | IOException e) {
e.printStackTrace();
}
}
/**
* 二维码解析
*
* @param inPath
* 二维码图片地址
* @return 二维码文本内容
*/
public static String qrcodeParse(String inPath) {
// 文件检测
if (!new File(inPath).exists()) {
System.out.println("文件不存在:" + inPath);
return null;
}
String content = "";
try {
// 读取图片
BufferedImage image = ImageIO.read(new File(inPath));
// 提取图片像素
LuminanceSource source = new BufferedImageLuminanceSource(image);
// 二值化(将灰度设置为0或255)
Binarizer binarizer = new HybridBinarizer(source);
// 转换为二进制图片
BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);
// 相关配置
Map<DecodeHintType, Object> hints = new HashMap<DecodeHintType, Object>();
hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");
// 解析
Result result = new MultiFormatReader().decode(binaryBitmap, hints);// 对图像进行解码
// 获取文本
content = result.getText();
// 输出条形码类型(我使用的二维码,所以会输出QR_CODE)
System.out.println(result.getBarcodeFormat());
} catch (IOException | NotFoundException e) {
e.printStackTrace();
}
return content;
}
/***
* 一维码生成
*
* @param content
* 文本
* @param outPath
* 输出目录
* @param outName
* 输出文件名
* @param format
* 文件格式
* @param width
* 生成图片宽度
* @param height
* 生成图片高度
*/
public static void barCodeBuild(String content, String outPath, String outName, String format, int width,
int height) {
// 文件检测
if (!new File(outPath).exists()) {
new File(outPath).mkdirs();
}
Path path = FileSystems.getDefault().getPath(outPath, outName);
try {
Code128Writer writer = new Code128Writer();
BitMatrix matrix = writer.encode(content, BarcodeFormat.CODE_128, width, height);
MatrixToImageWriter.writeToPath(matrix, format, path);
System.out.println("调试输出:OK");
} catch (WriterException | IOException e) {
e.printStackTrace();
}
}
}
JavaWeb 二维码的更多相关文章
- 基于java生成二维码
二维码 二维码的概念 ...
- Java生成二维码(Java程序都可以使用)
工具类,链接:https://pan.baidu.com/s/18U399fTH5wBJPnL97pAekg 提取码:bmw7 注:里面的corejar包是使用的zxing的代码,我只是将其导出的ja ...
- Javascript生成二维码(QR)
网络上已经有非常多的二维码编码和解码工具和代码,很多都是服务器端的,也就是说需要一台服务器才能提供二维码的生成.本着对服务器性能的考虑,这种小事情都让服务器去做,感觉对不住服务器,尤其是对于大流量的网 ...
- iOS二维码生成、识别、扫描等
二维码扫描 前言: 最近的项目中使用到了二维码,二维码这个模块功能也完成:觉得还是有必要总结一下用来做记录.好长时间没有写二维码了都忘记在差不多了,重新拾起来还是挻快的. 二维码使用场景: 生活中有很 ...
- 很多人很想知道怎么扫一扫二维码就能打开网站,就能添加联系人,就能链接wifi,今天说下这些格式,明天做个demo
有些功能部分手机不能使用,网站,通讯录,wifi基本上每个手机都可以使用. 在看之前你可以扫一扫下面几个二维码先看看效果: 1.二维码生成 网址 (URL) 包含网址的 二维码生成 是大家平时最常接触 ...
- 免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
在生活中有一种东西几乎已经快要成为我们的另一个电子”身份证“,那就是二维码.无论是在软件开发的过程中,还是在普通用户的日常中,几乎都离不开二维码.二维码 (dimensional barcode) , ...
- 基于SignalR的消息推送与二维码描登录实现
1 概要说明 使用微信扫描登录相信大家都不会陌生吧,二维码与手机结合产生了不同应用场景,基于二维码的应用更是比较广泛.为了满足ios.android客户端与web短信平台的结合,特开发了基于Singl ...
- 微信小程序的机会在于重新理解群组与二维码
历时一年,唯一一个尚未发布就获得Pony Ma与Allen Zhang站台的产品:微信小程序,将于2017年1月9日正式上线了.我很期待.唯一要警惕的是:防止长考出臭棋. 在上线前夕,我对于如何借助小 ...
- javaScript生成二维码(支持中文,生成logo)
资料搜索 选择star最多的两个 第一个就是用的比较多的jquery.qrcode.js(但不支持中文,不能带logo)啦,第二个支持ie6+,支持中文,根据第二个源代码,使得,jquery.qrco ...
随机推荐
- C++子类的构造函数后面加:冒号的作用(转)
在C++类的构造函数中经常会看到如下格式的写法: MyWindow::MyWindow(QWidget* parent , Qt::WindowFlags flag) : QMainWindow(pa ...
- Kirinriki
Kirinriki 定义两个长度相等的字符串\(\{a_i\},\{b_i\}\)的距离为\(\sum_{i=1}^n|a_i-b_{n-i+1}|\)(其中n为字符串的长度),给出一个字符串\(\{ ...
- Java开发常见基础题大全
1.&和&&的区别? &:逻辑与(and),运算符两边的表达式均为true时,整个结果才为true. &&:短路与,如果第一个表达式为false时,第二 ...
- Java中IO流之字符流
我们有了字节流,为什么还需要字符流? 字符的底层是 字节 + 编码表 = 字符,字符是人能看懂的信息. 字符流在使用的时候,会以字节流为基础,把字节写入缓冲区,在缓冲区内根据编码类型(UTF-8,GB ...
- 特种设备TSG 认证流程
特种设备许可,也叫安全注册(原为AZ安全注册认可),现为TS.国家为了防止和减少事故,保障人民群众生命和财产安全,促进经济发展而强制实施的安全监察.它的作用相当于欧盟的“CE”认证,但比“CE”认证更 ...
- CSV (逗号分隔值文件格式)
逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本).纯文本意味着该文件是一个字符序列,不 ...
- Vue学习笔记【7】——Vue指令之v-model和双向数据绑定
v-model是唯一可以实现双向数据绑定的vue指令 单向数据绑定:修改内存中的数据,页面上同步更改.v-bind <!-- v-bind 只能实现数据的单向绑定,从 M 自动绑定到 V, 无法 ...
- 「CTS2019 | CTSC2019」随机立方体 解题报告
「CTS2019 | CTSC2019」随机立方体 据说这是签到题,但是我计数学的实在有点差,这里认真说一说. 我们先考虑一些事实 如果我们在位置\((x_0,y_0,z_0)\)钦定了一个极大数\( ...
- RichView
TRichView中文文档 TRichView 是Delphi/C++Builder 控件,主要用于显示.编辑和打印超文本文档. 新版本解决多个兼容性问题,更新了字符串标签.剪贴板.RTF和DB组件 ...
- AntiPlug
反插件工程 #pragma once #ifndef __ENHANFUNC_H__ #define __ENHANFUNC_H__ #include <iostream> #includ ...