`

转载 二维码生成

阅读更多

 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

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

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

 

本文连接:http://sjsky.iteye.com/blog/1136934

 

 

转载请注明来自:Michael's blog @ http://sjsky.iteye.com

分享到:
评论

相关推荐

    QR code二维码生成器

    QR code二维码生成 本软件是 Swetake 有限公司的作品。禁止以盈利为目地进行销售、发布,以及私自窜改软件程序内容,允许自己转载、发布。

    PHP二维码在线生成工具本地版v1.0

    程序按照当前时间和随机数组合生成png图片路径,确保图片文件不会重复,生成的图片存在于根目录,每个图片大小在1K~4K之间,图片长宽大小随文字多少而变化。测试200个汉字可以正常运行! 上传到PHP网站空间即可使用...

    转载纯VBA二维码程序QR码(源码)

    非原创,转载其他网络资源,通过Excel的VBA程序生成二维码,很有意思。

    PHP二维码在线生成工具 本地版 v1.0.zip

    PHP二维码在线生成工具按照当前时间和随机数组合生成png图片路径,确保图片文件不会重复,生成的图片存在于根目录,每个图片大小在1K~4K之间,图片长宽大小随文字多少而变化。测试200个汉字可以正常运行! 上传到...

    jquery qrcode生成二维码带公司logo

    jquery qrcode生成二维码带公司logo 转载别人的 &lt;script type='text/javascript' src='http://cdn.staticfile.org/jquery/2.1.1/jquery.min.js'&gt;&lt;/script&gt; ...

    PHP二维码在线生成工具 本地版 v1.0

    程序按照当前时间和随机数组合生成png图片路径,确保图片文件不会重复,生成的图片存在于根目录,每个图片大小在1K~4K之间,图片长宽大小随文字多少而变化。测试200个汉字可以正常运行! 上传到PHP网站空间即可使用...

    qrcode.rar

    要实现小程序上的二维码生成器,想想基于jquery的二维码生成插件有很多,但是小程序是不允许操作dom的,所以自己找了一个纯javascript版的二维码生成源码,然后换汤不换药把其中的hmtl5中的canvas改为小程序的canvas...

    Android RxTools集合

    Android开发人员不得不收集的工具类集合 | 支付宝支付 | 微信支付(统一下单) | 微信分享 | 一键集成UCrop选择圆形头像 | 一键集成二维码和条形码的扫描与生成 | 常用Dialog | WebView的封装可播放视频 | 仿斗鱼...

    基于android的共享车位app

    4.车主完成订单后,系统自动生成缴费二维码,让车主进行缴费 ———————————————— 版权声明:本文为CSDN博主「Android毕业设计源码」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及...

    labview Vision图像处理高清

    264 第二节 二维码识别... 266 2.1 视觉助手生成脚本... 266 2.2 视觉助手生成LabVIEW代码... 269 2.3 生成LabVIEW代码的优化... 271 2.3.1 删除冗余代码... 271 2.3.2 使用覆盖多段线函数覆盖条码边框... 271 ...

    石老师的LABVIEW 宝典

    第二节 二维码识别... 266 2.1 视觉助手生成脚本... 266 2.2 视觉助手生成LabVIEW代码... 269 2.3 生成LabVIEW代码的优化... 271 2.3.1 删除冗余代码... 271 2.3.2 使用覆盖多段线函数覆盖条码边框... 271 2.3.3 ...

    OrangeUI 1.74 D10.1&D10;.1.2&D10;.2.2 包含安装文档和DEMO, XE10.2编译通过

    以下转载自官方软件介绍 通过OrangeUI,您可以快速及稳定的实现如下功能,并且全部免费: 1.APP主页九宫格菜单,在主流APP中经常能够见到,OrangeUI只需要一个控件,而不是Image和Label堆出来实现。 2.广告图片...

Global site tag (gtag.js) - Google Analytics