blog迁移至 :http://www.micmiu.com
周末试用下Android手机的二维码扫描软件,扫描了下火车票、名片等等,觉得非常不错很有意思的。当然Java也可以实现这些,现在就分享下如何简单用Java实现二维码中QRCode的编码和解码(可以手机扫描验证)。
涉及到的一些主要类库,方便大家下载:
- 编码 lib:Qrcode_swetake.jar (官网介绍 -- http://www.swetake.com/qr/index-e.html)
- 解码 lib:qrcode.jar (官网介绍 -- http://sourceforge.jp/projects/qrcode/)
后来发现一个更好的条形码和二维码的开源软件(ZXing),详细介绍见 :http://sjsky.iteye.com/blog/1142177
【一】、编码:
QRCodeEncoderHandler.java
- package michael.qrcode;
- import java.awt.Color;
- import java.awt.Graphics2D;
- import java.awt.image.BufferedImage;
- import java.io.File;
- import javax.imageio.ImageIO;
- import com.swetake.util.Qrcode;
- /**
- * 二维码生成器
- * @blog http://sjsky.iteye.com
- * @author Michael
- */
- public class QRCodeEncoderHandler {
- /**
- * 生成二维码(QRCode)图片
- * @param content
- * @param imgPath
- */
- public void encoderQRCode(String content, String imgPath) {
- try {
- Qrcode qrcodeHandler = new Qrcode();
- qrcodeHandler.setQrcodeErrorCorrect('M');
- qrcodeHandler.setQrcodeEncodeMode('B');
- qrcodeHandler.setQrcodeVersion(7);
- System.out.println(content);
- byte[] contentBytes = content.getBytes("gb2312");
- BufferedImage bufImg = new BufferedImage(140, 140,
- BufferedImage.TYPE_INT_RGB);
- Graphics2D gs = bufImg.createGraphics();
- gs.setBackground(Color.WHITE);
- gs.clearRect(0, 0, 140, 140);
- // 设定图像颜色 > BLACK
- gs.setColor(Color.BLACK);
- // 设置偏移量 不设置可能导致解析出错
- int pixoff = 2;
- // 输出内容 > 二维码
- if (contentBytes.length > 0 && contentBytes.length < 120) {
- boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes);
- for (int i = 0; i < codeOut.length; i++) {
- for (int j = 0; j < codeOut.length; j++) {
- if (codeOut[j][i]) {
- gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
- }
- }
- }
- } else {
- System.err.println("QRCode content bytes length = "
- + contentBytes.length + " not in [ 0,120 ]. ");
- }
- gs.dispose();
- bufImg.flush();
- File imgFile = new File(imgPath);
- // 生成二维码QRCode图片
- ImageIO.write(bufImg, "png", imgFile);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * @param args the command line arguments
- */
- public static void main(String[] args) {
- String imgPath = "D:/test/twocode/Michael_QRCode.png";
- String content = "Hello 大大、小小,welcome to QRCode!"
- + "\nMyblog [ http://sjsky.iteye.com ]"
- + "\nEMail [ sjsky007@gmail.com ]" + "\nTwitter [ @suncto ]";
- QRCodeEncoderHandler handler = new QRCodeEncoderHandler();
- handler.encoderQRCode(content, imgPath);
- System.out.println("encoder QRcode success");
- }
- }
package michael.qrcode; import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import com.swetake.util.Qrcode; /** * 二维码生成器 * @blog http://sjsky.iteye.com * @author Michael */ public class QRCodeEncoderHandler { /** * 生成二维码(QRCode)图片 * @param content * @param imgPath */ public void encoderQRCode(String content, String imgPath) { try { Qrcode qrcodeHandler = new Qrcode(); qrcodeHandler.setQrcodeErrorCorrect('M'); qrcodeHandler.setQrcodeEncodeMode('B'); qrcodeHandler.setQrcodeVersion(7); System.out.println(content); byte[] contentBytes = content.getBytes("gb2312"); BufferedImage bufImg = new BufferedImage(140, 140, BufferedImage.TYPE_INT_RGB); Graphics2D gs = bufImg.createGraphics(); gs.setBackground(Color.WHITE); gs.clearRect(0, 0, 140, 140); // 设定图像颜色 > BLACK gs.setColor(Color.BLACK); // 设置偏移量 不设置可能导致解析出错 int pixoff = 2; // 输出内容 > 二维码 if (contentBytes.length > 0 && contentBytes.length < 120) { boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes); for (int i = 0; i < codeOut.length; i++) { for (int j = 0; j < codeOut.length; j++) { if (codeOut[j][i]) { gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3); } } } } else { System.err.println("QRCode content bytes length = " + contentBytes.length + " not in [ 0,120 ]. "); } gs.dispose(); bufImg.flush(); File imgFile = new File(imgPath); // 生成二维码QRCode图片 ImageIO.write(bufImg, "png", imgFile); } catch (Exception e) { e.printStackTrace(); } } /** * @param args the command line arguments */ public static void main(String[] args) { String imgPath = "D:/test/twocode/Michael_QRCode.png"; String content = "Hello 大大、小小,welcome to QRCode!" + "\nMyblog [ http://sjsky.iteye.com ]" + "\nEMail [ sjsky007@gmail.com ]" + "\nTwitter [ @suncto ]"; QRCodeEncoderHandler handler = new QRCodeEncoderHandler(); handler.encoderQRCode(content, imgPath); System.out.println("encoder QRcode success"); } }
运行后生成的二维码图片如下:
此时就可用手机的二维码扫描软件(本人用的:android 快拍二维码 )来测试下,识别成功的截图如下:
喜欢的朋友可以下载后试一试,做一些名片或者自己喜欢的东西。当然Java也可以对二维码图片解码,具体看下面关于解码的内容。
【二】、解码:
QRCodeDecoderHandler.java
- package michael.qrcode;
- import java.awt.image.BufferedImage;
- import java.io.File;
- import java.io.IOException;
- import javax.imageio.ImageIO;
- import jp.sourceforge.qrcode.QRCodeDecoder;
- import jp.sourceforge.qrcode.data.QRCodeImage;
- import jp.sourceforge.qrcode.exception.DecodingFailedException;
- /**
- * @blog http://sjsky.iteye.com
- * @author Michael
- */
- public class QRCodeDecoderHandler {
- /**
- * 解码二维码
- * @param imgPath
- * @return String
- */
- public String decoderQRCode(String imgPath) {
- // QRCode 二维码图片的文件
- File imageFile = new File(imgPath);
- BufferedImage bufImg = null;
- String decodedData = null;
- try {
- bufImg = ImageIO.read(imageFile);
- QRCodeDecoder decoder = new QRCodeDecoder();
- decodedData = new String(decoder.decode(new J2SEImage(bufImg)));
- // try {
- // System.out.println(new String(decodedData.getBytes("gb2312"),
- // "gb2312"));
- // } catch (Exception e) {
- // // TODO: handle exception
- // }
- } catch (IOException e) {
- System.out.println("Error: " + e.getMessage());
- e.printStackTrace();
- } catch (DecodingFailedException dfe) {
- System.out.println("Error: " + dfe.getMessage());
- dfe.printStackTrace();
- }
- return decodedData;
- }
- /**
- * @param args the command line arguments
- */
- public static void main(String[] args) {
- QRCodeDecoderHandler handler = new QRCodeDecoderHandler();
- String imgPath = "d:/test/twocode/Michael_QRCode.png";
- String decoderContent = handler.decoderQRCode(imgPath);
- System.out.println("解析结果如下:");
- System.out.println(decoderContent);
- System.out.println("========decoder success!!!");
- }
- class J2SEImage implements QRCodeImage {
- BufferedImage bufImg;
- public J2SEImage(BufferedImage bufImg) {
- this.bufImg = bufImg;
- }
- public int getWidth() {
- return bufImg.getWidth();
- }
- public int getHeight() {
- return bufImg.getHeight();
- }
- public int getPixel(int x, int y) {
- return bufImg.getRGB(x, y);
- }
- }
- }
package michael.qrcode; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import jp.sourceforge.qrcode.QRCodeDecoder; import jp.sourceforge.qrcode.data.QRCodeImage; import jp.sourceforge.qrcode.exception.DecodingFailedException; /** * @blog http://sjsky.iteye.com * @author Michael */ public class QRCodeDecoderHandler { /** * 解码二维码 * @param imgPath * @return String */ public String decoderQRCode(String imgPath) { // QRCode 二维码图片的文件 File imageFile = new File(imgPath); BufferedImage bufImg = null; String decodedData = null; try { bufImg = ImageIO.read(imageFile); QRCodeDecoder decoder = new QRCodeDecoder(); decodedData = new String(decoder.decode(new J2SEImage(bufImg))); // try { // System.out.println(new String(decodedData.getBytes("gb2312"), // "gb2312")); // } catch (Exception e) { // // TODO: handle exception // } } catch (IOException e) { System.out.println("Error: " + e.getMessage()); e.printStackTrace(); } catch (DecodingFailedException dfe) { System.out.println("Error: " + dfe.getMessage()); dfe.printStackTrace(); } return decodedData; } /** * @param args the command line arguments */ public static void main(String[] args) { QRCodeDecoderHandler handler = new QRCodeDecoderHandler(); String imgPath = "d:/test/twocode/Michael_QRCode.png"; String decoderContent = handler.decoderQRCode(imgPath); System.out.println("解析结果如下:"); System.out.println(decoderContent); System.out.println("========decoder success!!!"); } class J2SEImage implements QRCodeImage { BufferedImage bufImg; public J2SEImage(BufferedImage bufImg) { this.bufImg = bufImg; } public int getWidth() { return bufImg.getWidth(); } public int getHeight() { return bufImg.getHeight(); } public int getPixel(int x, int y) { return bufImg.getRGB(x, y); } } }
运行结果如下(解码出的内容和之前输入的内容一致 ):
解析结果如下:
Hello 大大、小小,welcome to QRCode!
Myblog [ http://sjsky.iteye.com ]
EMail [ sjsky007@gmail.com ]
Twitter [ @suncto ]
========decoder success!!!
Hello 大大、小小,welcome to QRCode!
Myblog [ http://sjsky.iteye.com ]
EMail [ sjsky007@gmail.com ]
Twitter [ @suncto ]
========decoder success!!!
本文连接:http://sjsky.iteye.com/blog/1136934
转载请注明来自:Michael's blog @ http://sjsky.iteye.com
相关推荐
QR code二维码生成 本软件是 Swetake 有限公司的作品。禁止以盈利为目地进行销售、发布,以及私自窜改软件程序内容,允许自己转载、发布。
程序按照当前时间和随机数组合生成png图片路径,确保图片文件不会重复,生成的图片存在于根目录,每个图片大小在1K~4K之间,图片长宽大小随文字多少而变化。测试200个汉字可以正常运行! 上传到PHP网站空间即可使用...
非原创,转载其他网络资源,通过Excel的VBA程序生成二维码,很有意思。
PHP二维码在线生成工具按照当前时间和随机数组合生成png图片路径,确保图片文件不会重复,生成的图片存在于根目录,每个图片大小在1K~4K之间,图片长宽大小随文字多少而变化。测试200个汉字可以正常运行! 上传到...
jquery qrcode生成二维码带公司logo 转载别人的 <script type='text/javascript' src='http://cdn.staticfile.org/jquery/2.1.1/jquery.min.js'></script> ...
程序按照当前时间和随机数组合生成png图片路径,确保图片文件不会重复,生成的图片存在于根目录,每个图片大小在1K~4K之间,图片长宽大小随文字多少而变化。测试200个汉字可以正常运行! 上传到PHP网站空间即可使用...
要实现小程序上的二维码生成器,想想基于jquery的二维码生成插件有很多,但是小程序是不允许操作dom的,所以自己找了一个纯javascript版的二维码生成源码,然后换汤不换药把其中的hmtl5中的canvas改为小程序的canvas...
Android开发人员不得不收集的工具类集合 | 支付宝支付 | 微信支付(统一下单) | 微信分享 | 一键集成UCrop选择圆形头像 | 一键集成二维码和条形码的扫描与生成 | 常用Dialog | WebView的封装可播放视频 | 仿斗鱼...
4.车主完成订单后,系统自动生成缴费二维码,让车主进行缴费 ———————————————— 版权声明:本文为CSDN博主「Android毕业设计源码」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及...
以下转载自官方软件介绍 通过OrangeUI,您可以快速及稳定的实现如下功能,并且全部免费: 1.APP主页九宫格菜单,在主流APP中经常能够见到,OrangeUI只需要一个控件,而不是Image和Label堆出来实现。 2.广告图片...