java二维码小试牛刀
旁白:
由于工作需要,要做一个java的二维码的图片,花了2天的时间学习了一下,过程中也遇到了一些问题,这里做个笔记,收藏了。
废话不多说了,入题吧!
转自:http://www.open-open.com/lib/view/open1355055725476.html
概念:
二维码,又称 二维条码,二维条形码最早发明于日本,它是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的,在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理。它具有条码技术的一些共性:每种码制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。同时还具有对不同行的信息自动 识别功能、及处理图形旋转变化等特点。
1.java这边的话生成二维码有很多开发的jar包如zxing,qrcode(前者是谷歌开发的后者则是小日本开发的),这里的话我使用zxing的开发包来弄。
ZXing项目是google code上面提供的一个关于条码编解码的开源项目。
2.先下载zxing开发包,这里用到的只是core那个jar包(这里需要j2me和core两个包)
这里说一下zxing的下载:
1. 源码zip包的下载地址为:http://code.google.com/p/zxing/。要对项目进行二次开发,首先你需要在源码下载列表中下载ZXing的zip源代码解压文件,你会看到里面有很多文件夹,包括J2SE的,Android的,J2ME,C#等等。这里以J2SE为例。需要使用里面的Core和J2SE文件夹。然后导入到你在Eclipse中创建的工程。
上面的方式需要粘入相当多的代码,个人不太喜欢,所以上面的解决方案就是把上面的东西写到一个单独的java project里打个jar包,就很方便了。
2. 与其打个jar包不如直接下载一个jar不就解决了吗,OK,呦呦,这个主意不错,灵感突发滴结果!哦耶!BU...T,JAR哪里找呢,哪里找啊哪里找!哎....!
地址就是:http://mvnrepository.com/artifact/com.google.zxing(里面版本自己找吧,这里提醒读者,2.3的话好像是对jdk1.7有依赖了,如果阁下的是1.7前的,2.2版是没问题的,这个我已经测试过了!)
A. core为zxing的核心代码,包括encode和decode的代码;
B. javase可以定义为一个辅助代码,主要提供一些工具类。
比如:读取image的代码类ImageReader、写image到文件的类MatrixToImageWriter。充分使用zxing的javase模块提供的工具类,既方便了代码的编写工作,又避免了上网找一些类似的代码。
代码:
使用zxing开发还需要一个类,代码如下(原作者代码写出的图片中用手机扫出的汉字为乱码问题,这里做了修改):
package com.horizon.action; import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Hashtable; import javax.imageio.ImageIO; import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.ReaderException;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer; public class TestEnDeCode { public TestEnDeCode() {
} /**
* @param args
*/
public static void main(String[] args) {
TestEnDeCode t = new TestEnDeCode();
t.encode();
t.decode();
} // 编码
public void encode() {
try {
String str = "CN:男;COP:公司;ZW:职务";// 二维码内容
String path = "D:\\hwy.png";
BitMatrix byteMatrix;
byteMatrix = new MultiFormatWriter().encode(
// 在Zxing转码之前,手动转码,避免了中文乱码的错误
new String(str.getBytes(), "iso-8859-1"),
BarcodeFormat.QR_CODE, , );
File file = new File(path); MatrixToImageWriter.writeToFile(byteMatrix, "png", file);
} catch (Exception e) {
e.printStackTrace();
}
} // 解码
public void decode() {
try {
String imgPath = "D:\\hwy.png";
File file = new File(imgPath);
BufferedImage image;
try {
image = ImageIO.read(file);
if (image == null) {
System.out.println("Could not decode image");
}
LuminanceSource source = new BufferedImageLuminanceSource(image);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(
source));
Result result;
Hashtable<DecodeHintType, String> hints = new Hashtable<DecodeHintType, String>();
hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");
result = new MultiFormatReader().decode(bitmap, hints);
String resultStr = result.getText();
System.out.println(resultStr); } catch (IOException ioe) {
System.out.println(ioe.toString());
} catch (ReaderException re) {
System.out.println(re.toString());
} } catch (Exception ex) { }
} }
问题总结:
1. ZXing扫描二维码出现中文乱码的问题:
ZXing扫条形码没有问题,但是扫描二维码的时候却有一部分是乱码,或者不是中文的问题。
只要以ISO-8859-1的格式来编码,取出结果再进行相应的转换,问题就解决了,并不需要修改源码,可以参考上面的代码。
2. 报错:java.lang.UnsupportedClassVersionError: com/google/zxing/client/j2se/MatrixToImageWriter
遇到这个问题的话,98%的概率是JDK的版本与ZXing版不搭了,上面已经说过了,2.2版本在JDK1.6应该是没问题的,2.3的话应该是对JDK1.7有依赖了。
读者可以试试别的版本,这里有个链接可以解释的:
喜欢追求技术真谛的小伙伴们可以研究下啊。
代码下载地址:http://download.csdn.net/detail/tvcctv27tv/6840955
java二维码小试牛刀的更多相关文章
- Atitit java 二维码识别 图片识别
Atitit java 二维码识别 图片识别 1.1. 解码11.2. 首先,我们先说一下二维码一共有40个尺寸.官方叫版本Version.11.3. 二维码的样例:21.4. 定位图案21.5. 数 ...
- java二维码生成-谷歌(Google.zxing)开源二维码生成学习及实例
java二维码生成-谷歌(Google.zxing)开源二维码生成的实例及介绍 我们使用比特矩阵(位矩阵)的QR码编码在缓冲图片上画出二维码 实例有以下一个传入参数 OutputStream ou ...
- Java二维码生成与解码
基于google zxing 的Java二维码生成与解码 一.添加Maven依赖(解码时需要上传二维码图片,所以需要依赖文件上传包) <!-- google二维码工具 --> &l ...
- [转]java二维码生成与解析代码实现
转载地址:点击打开链接 二维码,是一种采用黑白相间的平面几何图形通过相应的编码算法来记录文字.图片.网址等信息的条码图片.如下图 二维码的特点: 1. 高密度编码,信息容量大 可容纳多达1850个大 ...
- java二维码生成与解析代码实现
TwoDimensionCode类:二维码操作核心类 package qrcode; import java.awt.Color; import java.awt.Graphics2D; import ...
- Java二维码登录流程实现(包含短地址生成,含部分代码)
近年来,二维码的使用越来越风生水起,笔者最近手头也遇到了一个需要使用二维码扫码登录网站的活,所以研究了一下这一套机制,并用代码实现了整个流程,接下来就和大家聊聊二维码登录及的那些事儿. 二维码原理 二 ...
- java二维码开发
之前就写过很多关于二维码的东西,一直没有时间整理一下,所以呢今天就先来介绍一下如何利用java开发二维码.生成二维码有很多jar包可以实现,例如Zxing,QRcode,前者是谷歌的,后者日本的,这里 ...
- java 二维码
在http://www.ostools.net/qr看到了一个生成二维码的工具,于是就产生了一个想法: 为什么自己不做一个二维码的生成和解析工具呢?花了一个多钟的时间,嘿嘿,就做出来啦... 先来看看 ...
- java二维码生成
import java.io.File; import java.nio.file.Path; import java.util.HashMap; import com.google.zxing.Ba ...
随机推荐
- 缓存(LruCache)机制
LruCache 1.变量 private final LinkedHashMap<K, V> map; private int size;//已经存储的数据大小 private int ...
- ubuntu安装wine
1.安装源 sudo add-apt-repository ppa:wine/wine-builds sudo apt-get update 2.安装wine sudo apt-get install ...
- 使用Nginx的配置对cc攻击进行简单防御
ddos攻击:分布式拒绝服务攻击,就是利用大量肉鸡或伪造IP,发起大量的服务器请求,最后导致服务器瘫痪的攻击. cc攻击:类似于ddos攻击,不过它的特点是主要是发起大量页面请求,所以流量不大,但是却 ...
- thinkphp结合bootstrap打造个性化分页
分页功能是web开发中常见的一项功能,也存在很多形式,这里主要讲一下利用thinkPHP框架的page类来打造一款bootstrap风格的分页过程. 首先需要去thinkPHP官网现在其分页扩展类ht ...
- VB查询数据库之终极篇——机房收费系统总结(七)
机房收费系统总结系列到此就算是要结束了.在做机房收费系统之前,做了学生管理系统,可以说,对机房收费系统的帮助很大. 在机房收费系统中,数据库的查询,数据写入数据库,更改数据库内的信息等一些操作在学生信 ...
- [BZOJ2159]Crash的文明世界(斯特林数+树形DP)
题意:给定一棵树,求$S(i)=\sum_{j=1}^{n}dist(i,j)^k$.题解:根据斯特林数反演得到:$n^m=\sum_{i=0}^{n}C(n,i)\times i!\times S( ...
- 2017 icpc 西安网络赛
F. Trig Function 样例输入 2 0 2 1 2 2 样例输出 998244352 0 2 找啊找啊找数列和论文.cosnx可以用切比雪夫多项式弄成(cosx)的多项式,然后去找到了相关 ...
- [Luogu2656]采蘑菇
题目大意: 给你一个有向图,每条边有一个边权w以及恢复系数k, 你从s点出发乱走,经过某条边时会获得相应的收益w,而当第二次经过这条边时相应的收益为w*k下取整. 问你最大能获得的收益为多少? 思路: ...
- Codeforces Beta Round #3 D. Least Cost Bracket Sequence 优先队列
D. Least Cost Bracket Sequence 题目连接: http://www.codeforces.com/contest/3/problem/D Description This ...
- Matlab中如何读取.dat文件
处理movielens1M数据集 中间有个双冒号,直接用load的只读取第一列,这时候我们可以用dlmread(中间是l不是i),如下图,只需要提取1 3 5列就好了.