java利用zxing编码解码一维码与二维码
- 最近琢磨了一下二维码、一维码的编码、解码方法,感觉google的zxing用起来还是比较方便。
- 本人原创,欢迎转载,转载请标注原文地址:http://wallimn.iteye.com/blog/2071020
- 一、工具类
- Java代码 收藏代码
- package com.exam.services.qrcode;
- 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.WriterException;
- import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
- import com.google.zxing.common.BitMatrix;
- import com.google.zxing.common.HybridBinarizer;
- import javax.imageio.ImageIO;
- import java.io.File;
- import java.io.OutputStream;
- import java.io.IOException;
- import java.util.Hashtable;
- import java.awt.image.BufferedImage;
- /**
- * 使用ZXing2.3,生成条码的辅助类。可以编码、解码。编码使用code包,解码需要javase包。
- *
- * <br/>
- * <br/>
- * 作者:wallimn<br/>
- * 联系:54871876@qq.com,http://wallimn.iteye.com<br/>
- * 时间:2014年5月25日 下午10:33:05<br/>
- */
- public final class MatrixUtil {
- private static final String CHARSET = "utf-8";
- private static final int BLACK = 0xFF000000;
- private static final int WHITE = 0xFFFFFFFF;
- /**
- * 禁止生成实例,生成实例也没有意义。
- */
- private MatrixUtil() {
- }
- /**
- * 生成矩阵,是一个简单的函数,参数固定,更多的是使用示范。
- *
- * <br/>
- * <br/>
- * 作者:wallimn<br/>
- * 时间:2014年5月25日 下午10:41:12<br/>
- * 联系:54871876@qq.com<br/>
- *
- * @param text
- * @return
- */
- public static BitMatrix toQRCodeMatrix(String text, Integer width,
- Integer height) {
- if (width == null || width < 300) {
- width = 300;
- }
- if (height == null || height < 300) {
- height = 300;
- }
- // 二维码的图片格式
- Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
- // 内容所使用编码
- hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
- BitMatrix bitMatrix = null;
- try {
- bitMatrix = new MultiFormatWriter().encode(text,
- BarcodeFormat.QR_CODE, width, height, hints);
- } catch (WriterException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- // 生成二维码
- // File outputFile = new File("d:"+File.separator+"new.gif");
- // MatrixUtil.writeToFile(bitMatrix, format, outputFile);
- return bitMatrix;
- }
- /**
- * 将指定的字符串生成二维码图片。简单的使用示例。
- *
- * <br/>
- * <br/>
- * 作者:wallimn<br/>
- * 时间:2014年5月25日 下午10:44:52<br/>
- * 联系:54871876@qq.com<br/>
- *
- * @param text
- * @param file
- * @param format
- * @return
- */
- public boolean toQrcodeFile(String text, File file, String format) {
- BitMatrix matrix = toQRCodeMatrix(text, null, null);
- if (matrix != null) {
- try {
- writeToFile(matrix, format, file);
- return true;
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- return false;
- }
- /**
- * 根据点矩阵生成黑白图。 作者:wallimn<br/>
- * 时间:2014年5月25日 下午10:26:22<br/>
- * 联系:54871876@qq.com<br/>
- */
- public static BufferedImage toBufferedImage(BitMatrix matrix) {
- int width = matrix.getWidth();
- int height = matrix.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, matrix.get(x, y) ? BLACK : WHITE);
- }
- }
- return image;
- }
- /**
- * 将字符串编成一维条码的矩阵
- *
- * <br/>
- * <br/>
- * 作者:wallimn<br/>
- * 时间:2014年5月25日 下午10:56:34<br/>
- * 联系:54871876@qq.com<br/>
- *
- * @param str
- * @param width
- * @param height
- * @return
- */
- public static BitMatrix toBarCodeMatrix(String str, Integer width,
- Integer height) {
- if (width == null || width < 200) {
- width = 200;
- }
- if (height == null || height < 50) {
- height = 50;
- }
- try {
- // 文字编码
- Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
- hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
- BitMatrix bitMatrix = new MultiFormatWriter().encode(str,
- BarcodeFormat.CODE_128, width, height, hints);
- return bitMatrix;
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
- /**
- * 根据矩阵、图片格式,生成文件。 作者:wallimn<br/>
- * 时间:2014年5月25日 下午10:26:43<br/>
- * 联系:54871876@qq.com<br/>
- */
- public static void writeToFile(BitMatrix matrix, String format, File file)
- throws IOException {
- BufferedImage image = toBufferedImage(matrix);
- if (!ImageIO.write(image, format, file)) {
- throw new IOException("Could not write an image of format "
- + format + " to " + file);
- }
- }
- /**
- * 将矩阵写入到输出流中。 作者:wallimn<br/>
- * 时间:2014年5月25日 下午10:27:58<br/>
- * 联系:54871876@qq.com<br/>
- */
- public static void writeToStream(BitMatrix matrix, String format,
- OutputStream stream) throws IOException {
- BufferedImage image = toBufferedImage(matrix);
- if (!ImageIO.write(image, format, stream)) {
- throw new IOException("Could not write an image of format "
- + format);
- }
- }
- /**
- * 解码,需要javase包。
- *
- * <br/>
- * <br/>
- * 作者:wallimn<br/>
- * 时间:2014年5月25日 下午11:06:07<br/>
- * 联系:54871876@qq.com<br/>
- *
- * @param file
- * @return
- */
- public static String decode(File file) {
- BufferedImage image;
- try {
- if (file == null || file.exists() == false) {
- throw new Exception(" File not found:" + file.getPath());
- }
- image = ImageIO.read(file);
- LuminanceSource source = new BufferedImageLuminanceSource(image);
- BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
- Result result;
- // 解码设置编码方式为:utf-8,
- Hashtable hints = new Hashtable();
- hints.put(DecodeHintType.CHARACTER_SET, CHARSET);
- result = new MultiFormatReader().decode(bitmap, hints);
- return result.getText();
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
- }
- 二、使用示例
- Java代码 收藏代码
- package com.exam.services.qrcode;
- import java.io.File;
- public class Test {
- /**
- * 测试函数。简单地将指定的字符串生成二维码图片。
- *
- * <br/><br/>
- * 作者:wallimn<br/>
- * 时间:2014年5月25日 下午10:30:00<br/>
- * 联系:54871876@qq.com<br/>
- */
- public static void main(String[] args) throws Exception {
- String text = "http://wallimn.itey.com";
- String result;
- String format = "gif";
- //生成二维码
- File outputFile = new File("d:"+File.separator+"rqcode.gif");
- MatrixUtil.writeToFile(MatrixUtil.toQRCodeMatrix(text, null, null), format, outputFile);
- result = MatrixUtil.decode(outputFile);
- System.out.println(result);
- outputFile = new File("d:"+File.separator+"barcode.gif");
- MatrixUtil.writeToFile(MatrixUtil.toBarCodeMatrix(text, null, null), format, outputFile);
- result = MatrixUtil.decode(outputFile);
- System.out.println(result);
- }
- }
最近琢磨了一下二维码、一维码的编码、解码方法,感觉google的zxing用起来还是比较方便。
本人原创,欢迎转载,转载请标注原文地址:http://wallimn.iteye.com/blog/2071020
一、工具类
- package com.exam.services.qrcode;
- 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.WriterException;
- import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
- import com.google.zxing.common.BitMatrix;
- import com.google.zxing.common.HybridBinarizer;
- import javax.imageio.ImageIO;
- import java.io.File;
- import java.io.OutputStream;
- import java.io.IOException;
- import java.util.Hashtable;
- import java.awt.image.BufferedImage;
- /**
- * 使用ZXing2.3,生成条码的辅助类。可以编码、解码。编码使用code包,解码需要javase包。
- *
- * <br/>
- * <br/>
- * 作者:wallimn<br/>
- * 联系:54871876@qq.com,http://wallimn.iteye.com<br/>
- * 时间:2014年5月25日 下午10:33:05<br/>
- */
- public final class MatrixUtil {
- private static final String CHARSET = "utf-8";
- private static final int BLACK = 0xFF000000;
- private static final int WHITE = 0xFFFFFFFF;
- /**
- * 禁止生成实例,生成实例也没有意义。
- */
- private MatrixUtil() {
- }
- /**
- * 生成矩阵,是一个简单的函数,参数固定,更多的是使用示范。
- *
- * <br/>
- * <br/>
- * 作者:wallimn<br/>
- * 时间:2014年5月25日 下午10:41:12<br/>
- * 联系:54871876@qq.com<br/>
- *
- * @param text
- * @return
- */
- public static BitMatrix toQRCodeMatrix(String text, Integer width,
- Integer height) {
- if (width == null || width < 300) {
- width = 300;
- }
- if (height == null || height < 300) {
- height = 300;
- }
- // 二维码的图片格式
- Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
- // 内容所使用编码
- hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
- BitMatrix bitMatrix = null;
- try {
- bitMatrix = new MultiFormatWriter().encode(text,
- BarcodeFormat.QR_CODE, width, height, hints);
- } catch (WriterException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- // 生成二维码
- // File outputFile = new File("d:"+File.separator+"new.gif");
- // MatrixUtil.writeToFile(bitMatrix, format, outputFile);
- return bitMatrix;
- }
- /**
- * 将指定的字符串生成二维码图片。简单的使用示例。
- *
- * <br/>
- * <br/>
- * 作者:wallimn<br/>
- * 时间:2014年5月25日 下午10:44:52<br/>
- * 联系:54871876@qq.com<br/>
- *
- * @param text
- * @param file
- * @param format
- * @return
- */
- public boolean toQrcodeFile(String text, File file, String format) {
- BitMatrix matrix = toQRCodeMatrix(text, null, null);
- if (matrix != null) {
- try {
- writeToFile(matrix, format, file);
- return true;
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- return false;
- }
- /**
- * 根据点矩阵生成黑白图。 作者:wallimn<br/>
- * 时间:2014年5月25日 下午10:26:22<br/>
- * 联系:54871876@qq.com<br/>
- */
- public static BufferedImage toBufferedImage(BitMatrix matrix) {
- int width = matrix.getWidth();
- int height = matrix.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, matrix.get(x, y) ? BLACK : WHITE);
- }
- }
- return image;
- }
- /**
- * 将字符串编成一维条码的矩阵
- *
- * <br/>
- * <br/>
- * 作者:wallimn<br/>
- * 时间:2014年5月25日 下午10:56:34<br/>
- * 联系:54871876@qq.com<br/>
- *
- * @param str
- * @param width
- * @param height
- * @return
- */
- public static BitMatrix toBarCodeMatrix(String str, Integer width,
- Integer height) {
- if (width == null || width < 200) {
- width = 200;
- }
- if (height == null || height < 50) {
- height = 50;
- }
- try {
- // 文字编码
- Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
- hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
- BitMatrix bitMatrix = new MultiFormatWriter().encode(str,
- BarcodeFormat.CODE_128, width, height, hints);
- return bitMatrix;
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
- /**
- * 根据矩阵、图片格式,生成文件。 作者:wallimn<br/>
- * 时间:2014年5月25日 下午10:26:43<br/>
- * 联系:54871876@qq.com<br/>
- */
- public static void writeToFile(BitMatrix matrix, String format, File file)
- throws IOException {
- BufferedImage image = toBufferedImage(matrix);
- if (!ImageIO.write(image, format, file)) {
- throw new IOException("Could not write an image of format "
- + format + " to " + file);
- }
- }
- /**
- * 将矩阵写入到输出流中。 作者:wallimn<br/>
- * 时间:2014年5月25日 下午10:27:58<br/>
- * 联系:54871876@qq.com<br/>
- */
- public static void writeToStream(BitMatrix matrix, String format,
- OutputStream stream) throws IOException {
- BufferedImage image = toBufferedImage(matrix);
- if (!ImageIO.write(image, format, stream)) {
- throw new IOException("Could not write an image of format "
- + format);
- }
- }
- /**
- * 解码,需要javase包。
- *
- * <br/>
- * <br/>
- * 作者:wallimn<br/>
- * 时间:2014年5月25日 下午11:06:07<br/>
- * 联系:54871876@qq.com<br/>
- *
- * @param file
- * @return
- */
- public static String decode(File file) {
- BufferedImage image;
- try {
- if (file == null || file.exists() == false) {
- throw new Exception(" File not found:" + file.getPath());
- }
- image = ImageIO.read(file);
- LuminanceSource source = new BufferedImageLuminanceSource(image);
- BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
- Result result;
- // 解码设置编码方式为:utf-8,
- Hashtable hints = new Hashtable();
- hints.put(DecodeHintType.CHARACTER_SET, CHARSET);
- result = new MultiFormatReader().decode(bitmap, hints);
- return result.getText();
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
- }
二、使用示例
- package com.exam.services.qrcode;
- import java.io.File;
- public class Test {
- /**
- * 测试函数。简单地将指定的字符串生成二维码图片。
- *
- * <br/><br/>
- * 作者:wallimn<br/>
- * 时间:2014年5月25日 下午10:30:00<br/>
- * 联系:54871876@qq.com<br/>
- */
- public static void main(String[] args) throws Exception {
- String text = "http://wallimn.itey.com";
- String result;
- String format = "gif";
- //生成二维码
- File outputFile = new File("d:"+File.separator+"rqcode.gif");
- MatrixUtil.writeToFile(MatrixUtil.toQRCodeMatrix(text, null, null), format, outputFile);
- result = MatrixUtil.decode(outputFile);
- System.out.println(result);
- outputFile = new File("d:"+File.separator+"barcode.gif");
- MatrixUtil.writeToFile(MatrixUtil.toBarCodeMatrix(text, null, null), format, outputFile);
- result = MatrixUtil.decode(outputFile);
- System.out.println(result);
- }
- }
java利用zxing编码解码一维码与二维码的更多相关文章
- C# 利用ZXing.Net来生成条形码和二维码
本文是利用ZXing.Net在WinForm中生成条形码,二维码的小例子,仅供学习分享使用,如有不足之处,还请指正. 什么是ZXing.Net? ZXing是一个开放源码的,用Java实现的多种格式的 ...
- ZXing拍摄代码扫描之后以区分一维码、二维码、其他代码
我怎么有二维码没有联系,最近遇到一个问题,,如何推断条码扫描到一维代码或者二维代码,辛苦了一个下午下班后自己,加上网上跟踪信息. 总结出两种方式能够解决该问题(推荐採用另外一种方式): 1.改动源代码 ...
- Halcon一维码和二维码的解码步骤和技巧——第11讲
针对Halcon中一维码和二维码的解码,我分别写了两篇文章,参见: <Halcon的一维条码解码步骤和解码技巧>:https://www.cnblogs.com/xh6300/p/1048 ...
- 【转】 Android 基于google Zxing实现对手机中的二维码进行扫描--不错
原文网址:http://blog.csdn.net/xiaanming/article/details/14450809 转载请注明出处:http://blog.csdn.net/xiaanming/ ...
- Android 基于google Zxing实现对手机中的二维码进行扫描
转载请注明出处:http://blog.csdn.net/xiaanming/article/details/14450809 有时候我们有这样子的需求,需要扫描手机中有二维码的的图片,所以今天实现的 ...
- .NET使用ZXing.NET生成中间带图片的二维码
很久之前就有写这样的代码了,只是一直没记录下来,偶然想写成博客. 把之前的代码封装成函数,以方便理解以及调用. 基于开源的 ZXing.NET 组件,代码如下: 先添加对ZXing.NET的引用,然后 ...
- C#使用zxing,zbar,thoughtworkQRcode解析二维码,附源代码
最近做项目需要解析二维码图片,找了一大圈,发现没有人去整理下开源的几个库案例,花了点时间 做了zxing,zbar和thoughtworkqrcode解析二维码案例,希望大家有帮助. zxing是谷歌 ...
- 使用qrcode输入信息生成二维码包含二维码说明信息,点击转化为图片并下载
说明:输入汉字和数字都可以识别并展示 <body> <h2 id="h2">二维码生成</h2> <br> <span id= ...
- asp.net生成店铺推广二维码,二维码中间加logo(源码)
二维条码比一维条码记载数据量更多,二维码条码是一种高密度.高信息含量的便携式数据文件,是实现证件及卡片等大容量.高可靠性信息自动存储.携带并可用机器自动识读的理想手段.而且可以记载更复杂的数据,比如图 ...
随机推荐
- Android Service学习之AIDL, Parcelable和远程服务
AIDL的作用 由于每个应用程序都运行在自己的进程空间,并且可以从应用程序UI运行另一个服务进程,而且经常会在不同的进程间传递对象.在Android平台,一个进程通常不能访问另一个进程的内存空 ...
- sqlserver 2000事务复制问题
2000现在用的估计不多了,把之前收集的一些复制问题整理发布出来.可能都是些很白很二的问题,但人总是由最初的无知不断成长,不对之处欢迎指正. sqlserver 2000事务复制问题服务器A(发布) ...
- javascript_获取iframe框架中元素节点的属性值
1. DOM:文档对象模型 [window 对象] 它是一个顶层对象,而不是另一个对象的属性即浏览器的窗口. [document 对象] 该对象是window和frames对象的一个属性,是显示于窗口 ...
- Win32和MFC项目如何输出调试信息到VS的调试窗口
直接举例说明: Win32项目: #include <Windows.h> OutputDebugString(TEXT("调试信息:MyCircleImpl::~MyCircl ...
- arping 通知网关刷新IP
arping -c 2 -I em1 -s 192.168.110.12 192.168.110.1
- PDB重命名
PDB重命名 将PDB clonedb重命名为rdb SQL> select name,open_mode from v$pdbs; NAME OPEN_MODE --------------- ...
- Feature Scaling
定义:Feature scaling is a method used to standardize the range of independent variables or features of ...
- php第三方登陆
学习之前,请大家先看一下oAuth协议. 首先呢,我们进入QQ互联的官方网站 http://connect.qq.com登入我们自己的QQ号,没有QQ号的小伙伴可以忽略本篇博文分享!
- git批量删除分支
要删除本地,首先要考虑以下三点 列出所有本地分支 搜索目标分支如:所有含有'dev'的分支 将搜索出的结果传给删除函数 所以我们可以得到: git br |grep 'dev' |xargs git ...
- 夺命雷公狗---node下的一聊天室-首发
今晚感觉挺蛋疼,就用了点时间,在node下开发了个聊天室来玩玩,不过之是简单的开发了套而已,并没多做什么考虑,, 但是发现了一个好处就是用node来写聊天室代码居然少得可怜,这个不佩服node都不行, ...