Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 1973|回复: 1

Java实例实现二维码QRCode的编码和解码

[复制链接]

该用户从未签到

发表于 2011-8-2 22:18:06 | 显示全部楼层 |阅读模式
       周末试用下Android手机的二维码扫描软件,扫描了下火车票、名片等等,觉得非常不错很有意思的。当然java也可以实现这些,现在就分享下如何简单用Java实现二维码中QRCode的编码和解码(可以手机扫描验证)。

    涉及到的一些主要类库,方便大家下载:

【一】、编码:
QRCodeEncoderHandler.java
  1. package michael.qrcode;
  2. import java.awt.Color;
  3. import java.awt.Graphics2D;
  4. import java.awt.image.BufferedImage;
  5. import java.io.File;
  6. import javax.imageio.ImageIO;
  7. import com.swetake.util.Qrcode;
  8. /**
  9. * 二维码生成器
  10. * @blog http://sjsky.iteye.com
  11. * @author Michael
  12. */
  13. public class QRCodeEncoderHandler {
  14.     /**
  15.      * 生成二维码(QRCode)图片
  16.      * @param content
  17.      * @param imgPath
  18.      */
  19.     public void encoderQRCode(String content, String imgPath) {
  20.         try {
  21.             Qrcode qrcodeHandler = new Qrcode();
  22.             qrcodeHandler.setQrcodeErrorCorrect('M');
  23.             qrcodeHandler.setQrcodeEncodeMode('B');
  24.             qrcodeHandler.setQrcodeVersion(7);
  25.             System.out.println(content);
  26.             byte[] contentBytes = content.getBytes("gb2312");
  27.             BufferedImage bufImg = new BufferedImage(140, 140,
  28.                     BufferedImage.TYPE_INT_RGB);
  29.             Graphics2D gs = bufImg.createGraphics();
  30.             gs.setBackground(Color.WHITE);
  31.             gs.clearRect(0, 0, 140, 140);
  32.             // 设定图像颜色 > BLACK
  33.             gs.setColor(Color.BLACK);
  34.             // 设置偏移量 不设置可能导致解析出错
  35.             int pixoff = 2;
  36.             // 输出内容 > 二维码
  37.             if (contentBytes.length > 0 && contentBytes.length < 120) {
  38.                 boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes);
  39.                 for (int i = 0; i < codeOut.length; i++) {
  40.                     for (int j = 0; j < codeOut.length; j++) {
  41.                         if (codeOut[j][i]) {
  42.                             gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
  43.                         }
  44.                     }
  45.                 }
  46.             } else {
  47.                 System.err.println("QRCode content bytes length = "
  48.                         + contentBytes.length + " not in [ 0,120 ]. ");
  49.             }
  50.             gs.dispose();
  51.             bufImg.flush();
  52.             File imgFile = new File(imgPath);
  53.             // 生成二维码QRCode图片
  54.             ImageIO.write(bufImg, "png", imgFile);
  55.         } catch (Exception e) {
  56.             e.printStackTrace();
  57.         }
  58.     }
  59.     /**
  60.      * @param args the command line arguments
  61.      */
  62.     public static void main(String[] args) {
  63.         String imgPath = "D:/test/twocode/Michael_QRCode.png";
  64.         String content = "Hello 大大、小小,welcome to QRCode!"
  65.                 + "\nMyblog [ http://www.dearbaba.com ]"
  66.                 + "\nEMail [ sjsky007@gmail.com ]" + "\nTwitter [ @suncto ]";
  67.         QRCodeEncoderHandler handler = new QRCodeEncoderHandler();
  68.         handler.encoderQRCode(content, imgPath);
  69.         System.out.println("encoder QRcode success");
  70.     }
  71. }
复制代码

运行后天生的二维码图片如下:


                                      





此时就可用手机的二维码扫描软件(本人用的:android 快拍二维码 )来测试下,识别成功的截图如下:






喜欢的朋友可以下载后试一试,做一些手刺或者自己喜欢的东西。当然Java也可以对二维码图片解码,详细看下面关于解码的内容。

【二】、解码:
QRCodeDecoderHandler.java
  1. package michael.qrcode;
  2. import java.awt.image.BufferedImage;
  3. import java.io.File;
  4. import java.io.IOException;
  5. import javax.imageio.ImageIO;
  6. import jp.sourceforge.qrcode.QRCodeDecoder;
  7. import jp.sourceforge.qrcode.data.QRCodeImage;
  8. import jp.sourceforge.qrcode.exception.DecodingFailedException;
  9. /**
  10. * @blog http://sjsky.iteye.com
  11. * @author Michael
  12. */
  13. public class QRCodeDecoderHandler {
  14.     /**
  15.      * 解码二维码
  16.      * @param imgPath
  17.      * @return String
  18.      */
  19.     public String decoderQRCode(String imgPath) {
  20.         // QRCode 二维码图片的文件
  21.         File imageFile = new File(imgPath);
  22.         BufferedImage bufImg = null;
  23.         String decodedData = null;
  24.         try {
  25.             bufImg = ImageIO.read(imageFile);
  26.             QRCodeDecoder decoder = new QRCodeDecoder();
  27.             decodedData = new String(decoder.decode(new J2SEImage(bufImg)));
  28.             // try {
  29.             // System.out.println(new String(decodedData.getBytes("gb2312"),
  30.             // "gb2312"));
  31.             // } catch (Exception e) {
  32.             // // TODO: handle exception
  33.             // }
  34.         } catch (IOException e) {
  35.             System.out.println("Error: " + e.getMessage());
  36.             e.printStackTrace();
  37.         } catch (DecodingFailedException dfe) {
  38.             System.out.println("Error: " + dfe.getMessage());
  39.             dfe.printStackTrace();
  40.         }
  41.         return decodedData;
  42.     }
  43.     /**
  44.      * @param args the command line arguments
  45.      */
  46.     public static void main(String[] args) {
  47.         QRCodeDecoderHandler handler = new QRCodeDecoderHandler();
  48.         String imgPath = "d:/test/twocode/Michael_QRCode.png";
  49.         String decoderContent = handler.decoderQRCode(imgPath);
  50.         System.out.println("解析结果如下:");
  51.         System.out.println(decoderContent);
  52.         System.out.println("========decoder success!!!");
  53.     }
  54.     class J2SEImage implements QRCodeImage {
  55.         BufferedImage bufImg;
  56.         public J2SEImage(BufferedImage bufImg) {
  57.             this.bufImg = bufImg;
  58.         }
  59.         public int getWidth() {
  60.             return bufImg.getWidth();
  61.         }
  62.         public int getHeight() {
  63.             return bufImg.getHeight();
  64.         }
  65.         public int getPixel(int x, int y) {
  66.             return bufImg.getRGB(x, y);
  67.         }
  68.     }
  69. }
复制代码

运行结果如下(解码出的内容和之前输入的内容一致 ):
解析结果如下:
Hello 大大、小小,welcome to QRCode!
Myblog [ http://www.dearbaba.com ]
EMail [ sjsky007@gmail.com ]
Twitter [ @suncto ]

========decoder success!!!
回复

使用道具 举报

该用户从未签到

发表于 2011-8-2 22:19:07 | 显示全部楼层
学习了。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-5-9 05:01 , Processed in 0.390814 second(s), 47 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表