A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 就业指导-王震阳老师 于 2014-10-6 11:45 编辑

用java生成与解析二维码

二维码常识地址

二维码的特点:

1.  高密度编码,信息容量大

可容纳多达1850个大写字母或2710个数字或1108个字节,或500多个汉字,比普通条码信息容量约高几十倍。

2.  编码范围广

该条码可以把图片、声音、文字、签字、指纹等可以数字化的信息进行编码,用条码表示出来;可以表示多种语言文字;可表示图像数据。

3.  容错能力强,具有纠错功能

这使得二维条码因穿孔、污损等引起局部损坏时,照样可以正确得到识读,损毁面积达50%仍可恢复信息。

4.  译码可靠性高

它比普通条码译码错误率百万分之二要低得多,误码率不超过千万分之一。

5.  可引入加密措施

保密性、防伪性好。

6.  成本低,易制作,持久耐用

正因为以上这些特点,二维码现在越来越流行,应用也是越来越广(详细了解请见百度百科,介绍不是本篇重点),所以掌握如何开发二维码是非常不错的知识储备,因此本篇将为大家讲解如何生成、解析二维码。

所需jar包:QRCode.jar

http://download.csdn.net/detail/wangpeng047/4008532

  1. package qrcode;

  2. import java.awt.Color;
  3. import java.awt.Graphics2D;
  4. import java.awt.image.BufferedImage;
  5. import java.io.File;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. import java.io.OutputStream;

  9. import javax.imageio.ImageIO;

  10. import jp.sourceforge.qrcode.QRCodeDecoder;
  11. import jp.sourceforge.qrcode.exception.DecodingFailedException;

  12. import com.swetake.util.Qrcode;

  13. public class TwoDimensionCode {
  14.        
  15.         /**
  16.          * 生成二维码(QRCode)图片
  17.          * @param content 存储内容
  18.          * @param imgPath 图片路径
  19.          */
  20.         public void encoderQRCode(String content, String imgPath) {
  21.                 this.encoderQRCode(content, imgPath, "png", 7);
  22.         }
  23.        
  24.         /**
  25.          * 生成二维码(QRCode)图片
  26.          * @param content 存储内容
  27.          * @param output 输出流
  28.          */
  29.         public void encoderQRCode(String content, OutputStream output) {
  30.                 this.encoderQRCode(content, output, "png", 7);
  31.         }
  32.        
  33.         /**
  34.          * 生成二维码(QRCode)图片
  35.          * @param content 存储内容
  36.          * @param imgPath 图片路径
  37.          * @param imgType 图片类型
  38.          */
  39.         public void encoderQRCode(String content, String imgPath, String imgType) {
  40.                 this.encoderQRCode(content, imgPath, imgType, 7);
  41.         }
  42.        
  43.         /**
  44.          * 生成二维码(QRCode)图片
  45.          * @param content 存储内容
  46.          * @param output 输出流
  47.          * @param imgType 图片类型
  48.          */
  49.         public void encoderQRCode(String content, OutputStream output, String imgType) {
  50.                 this.encoderQRCode(content, output, imgType, 7);
  51.         }

  52.         /**
  53.          * 生成二维码(QRCode)图片
  54.          * @param content 存储内容
  55.          * @param imgPath 图片路径
  56.          * @param imgType 图片类型
  57.          * @param size 二维码尺寸
  58.          */
  59.         public void encoderQRCode(String content, String imgPath, String imgType, int size) {
  60.                 try {
  61.                         BufferedImage bufImg = this.qRCodeCommon(content, imgType, size);
  62.                        
  63.                         File imgFile = new File(imgPath);
  64.                         // 生成二维码QRCode图片
  65.                         ImageIO.write(bufImg, imgType, imgFile);
  66.                 } catch (Exception e) {
  67.                         e.printStackTrace();
  68.                 }
  69.         }

  70.         /**
  71.          * 生成二维码(QRCode)图片
  72.          * @param content 存储内容
  73.          * @param output 输出流
  74.          * @param imgType 图片类型
  75.          * @param size 二维码尺寸
  76.          */
  77.         public void encoderQRCode(String content, OutputStream output, String imgType, int size) {
  78.                 try {
  79.                         BufferedImage bufImg = this.qRCodeCommon(content, imgType, size);
  80.                         // 生成二维码QRCode图片
  81.                         ImageIO.write(bufImg, imgType, output);
  82.                 } catch (Exception e) {
  83.                         e.printStackTrace();
  84.                 }
  85.         }
  86.        
  87.         /**
  88.          * 生成二维码(QRCode)图片的公共方法
  89.          * @param content 存储内容
  90.          * @param imgType 图片类型
  91.          * @param size 二维码尺寸
  92.          * @return
  93.          */
  94.         private BufferedImage qRCodeCommon(String content, String imgType, int size) {
  95.                 BufferedImage bufImg = null;
  96.                 try {
  97.                         Qrcode qrcodeHandler = new Qrcode();
  98.                         // 设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小
  99.                         qrcodeHandler.setQrcodeErrorCorrect('M');
  100.                         qrcodeHandler.setQrcodeEncodeMode('B');
  101.                         // 设置设置二维码尺寸,取值范围1-40,值越大尺寸越大,可存储的信息越大
  102.                         qrcodeHandler.setQrcodeVersion(size);
  103.                         // 获得内容的字节数组,设置编码格式
  104.                         byte[] contentBytes = content.getBytes("utf-8");
  105.                         // 图片尺寸
  106.                         int imgSize = 67 + 12 * (size - 1);
  107.                         bufImg = new BufferedImage(imgSize, imgSize, BufferedImage.TYPE_INT_RGB);
  108.                         Graphics2D gs = bufImg.createGraphics();
  109.                         // 设置背景颜色
  110.                         gs.setBackground(Color.WHITE);
  111.                         gs.clearRect(0, 0, imgSize, imgSize);

  112.                         // 设定图像颜色> BLACK
  113.                         gs.setColor(Color.BLACK);
  114.                         // 设置偏移量,不设置可能导致解析出错
  115.                         int pixoff = 2;
  116.                         // 输出内容> 二维码
  117.                         if (contentBytes.length > 0 && contentBytes.length < 800) {
  118.                                 boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes);
  119.                                 for (int i = 0; i < codeOut.length; i++) {
  120.                                         for (int j = 0; j < codeOut.length; j++) {
  121.                                                 if (codeOut[j][i]) {
  122.                                                         gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
  123.                                                 }
  124.                                         }
  125.                                 }
  126.                         } else {
  127.                                 throw new Exception("QRCode content bytes length = " + contentBytes.length + " not in [0, 800].");
  128.                         }
  129.                         gs.dispose();
  130.                         bufImg.flush();
  131.                 } catch (Exception e) {
  132.                         e.printStackTrace();
  133.                 }
  134.                 return bufImg;
  135.         }
  136.        
  137.         /**
  138.          * 解析二维码(QRCode)
  139.          * @param imgPath 图片路径
  140.          * @return
  141.          */
  142.         public String decoderQRCode(String imgPath) {
  143.                 // QRCode 二维码图片的文件
  144.                 File imageFile = new File(imgPath);
  145.                 BufferedImage bufImg = null;
  146.                 String content = null;
  147.                 try {
  148.                         bufImg = ImageIO.read(imageFile);
  149.                         QRCodeDecoder decoder = new QRCodeDecoder();
  150.                         content = new String(decoder.decode(new TwoDimensionCodeImage(bufImg)), "utf-8");
  151.                 } catch (IOException e) {
  152.                         System.out.println("Error: " + e.getMessage());
  153.                         e.printStackTrace();
  154.                 } catch (DecodingFailedException dfe) {
  155.                         System.out.println("Error: " + dfe.getMessage());
  156.                         dfe.printStackTrace();
  157.                 }
  158.                 return content;
  159.         }
  160.        
  161.         /**
  162.          * 解析二维码(QRCode)
  163.          * @param input 输入流
  164.          * @return
  165.          */
  166.         public String decoderQRCode(InputStream input) {
  167.                 BufferedImage bufImg = null;
  168.                 String content = null;
  169.                 try {
  170.                         bufImg = ImageIO.read(input);
  171.                         QRCodeDecoder decoder = new QRCodeDecoder();
  172.                         content = new String(decoder.decode(new TwoDimensionCodeImage(bufImg)), "utf-8");
  173.                 } catch (IOException e) {
  174.                         System.out.println("Error: " + e.getMessage());
  175.                         e.printStackTrace();
  176.                 } catch (DecodingFailedException dfe) {
  177.                         System.out.println("Error: " + dfe.getMessage());
  178.                         dfe.printStackTrace();
  179.                 }
  180.                 return content;
  181.         }

  182.         public static void main(String[] args) {
  183.                 String imgPath = "G:/TDDOWNLOAD/Michael_QRCode.png";
  184.                 String encoderContent = "Hello 大大、小小,welcome to QRCode!" + "\nMyblog [ http://sjsky.iteye.com ]" + "\nEMail [ sjsky007@gmail.com ]";
  185.                 TwoDimensionCode handler = new TwoDimensionCode();
  186.                 handler.encoderQRCode(encoderContent, imgPath, "png");
  187. //                try {
  188. //                        OutputStream output = new FileOutputStream(imgPath);
  189. //                        handler.encoderQRCode(content, output);
  190. //                } catch (Exception e) {
  191. //                        e.printStackTrace();
  192. //                }
  193.                 System.out.println("========encoder success");
  194.                
  195.                
  196.                 String decoderContent = handler.decoderQRCode(imgPath);
  197.                 System.out.println("解析结果如下:");
  198.                 System.out.println(decoderContent);
  199.                 System.out.println("========decoder success!!!");
  200.         }
  201. }
复制代码

TwoDimensionCodeImage 类:二维码图片对象

  1. package qrcode;

  2. import java.awt.image.BufferedImage;

  3. import jp.sourceforge.qrcode.data.QRCodeImage;

  4. public class TwoDimensionCodeImage implements QRCodeImage {

  5.         BufferedImage bufImg;
  6.        
  7.         public TwoDimensionCodeImage(BufferedImage bufImg) {
  8.                 this.bufImg = bufImg;
  9.         }
  10.        
  11.         @Override
  12.         public int getHeight() {
  13.                 return bufImg.getHeight();
  14.         }

  15.         @Override
  16.         public int getPixel(int x, int y) {
  17.                 return bufImg.getRGB(x, y);
  18.         }

  19.         @Override
  20.         public int getWidth() {
  21.                 return bufImg.getWidth();
  22.         }

  23. }
复制代码



30 个回复

倒序浏览
本帖最后由 bbdeyouxang 于 2014-10-7 00:15 编辑

受教了,很好玩的功能
回复 使用道具 举报
好东西,我要好好学
回复 使用道具 举报
没积分下载jar包,求分享
回复 使用道具 举报
下载jar还要积分,  ~~  求分享啊
回复 使用道具 举报
老师您看我这样做行不?    源码看了个大概  结果倒是出来了   但是异常那里没怎么理解...   不过我很贴心的把package语句去掉了呢~~~    嘿嘿..你看我才2分技术分...来扶个贫嘛...:P

zz_job.zip

2.33 KB, 阅读权限: 150, 下载次数: 0

回复 使用道具 举报
zz_job 中级黑马 2014-10-10 00:36:35
7#
呃..不好意思..发错地方了...
回复 使用道具 举报
zz_job 发表于 2014-10-10 00:36
呃..不好意思..发错地方了...

再在正确的版块发一个就行了
回复 使用道具 举报
我是来学习的我是来学习的
回复 使用道具 举报
试一试。很感兴趣。
回复 使用道具 举报
happyto1021 来自手机 中级黑马 2014-10-10 13:45:55
11#
。。。。。。。
回复 使用道具 举报
菜鸟来学习
回复 使用道具 举报

下载jar还要积分,  ~~  求分享啊
回复 使用道具 举报
我用的是谷歌的jar包。生成的是很简单的二维码。第一次尝试,挺好玩的~
回复 使用道具 举报
漠寒 中级黑马 2014-10-16 11:28:36
15#
试一试,感觉很好玩的样子
回复 使用道具 举报
学学,看看题,
回复 使用道具 举报
新人答题,请指多教!


Score20.rar

2.39 KB, 阅读权限: 150, 下载次数: 1

评分

参与人数 1技术分 +1 收起 理由
王震阳老师 + 1 赞一个!

查看全部评分

回复 使用道具 举报
受教, 来看题目
回复 使用道具 举报
好厉害,先收藏了。。。
回复 使用道具 举报
包含QRCode.jar的QRCodeDemo,可以添加个性logo


141211031402.png (9.87 KB, 下载次数: 244)

141211031402.png

QRCodeDemo.rar

1.01 MB, 阅读权限: 30, 下载次数: 18

评分

参与人数 1技术分 +1 收起 理由
王震阳老师 + 1 赞一个!

查看全部评分

回复 使用道具 举报 2 0
12下一页
您需要登录后才可以回帖 登录 | 加入黑马