Java实现二维码生成与识别

来源:互联网 发布:python plot 渐变颜色 编辑:程序博客网 时间:2024/06/16 20:05
 

java实现QRCODE二维码的编码与解码实例

众所周知,爪哇,是一种神奇的编程语言,用JAVA实现某一个功能,只是随便上网找一些对应的实现JAR包即可,于是,有了像JAR114这样专门提供给爪哇程序猿的下载的那么一堆网站。

本节主要讲JAVA实现二维码的编码与解码。

废话也就那么多了,转入正题。

需要的JAR包如下。

编码lib:Qrcode_swetake.jar   (官网介绍-- http://www.swetake.com/qr/index-e.html)             

解码lib:qrcode.jar                (官网介绍-- http://sourceforge.jp/projects/qrcode/)

 

【一】、编码:

QRCodeEncoderHandler.java

Java代码 

package michael.qrcode; 

 

import java.awt.Color; 

import java.awt.Graphics2D; 

importjava.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)图片

     * @paramcontent

     * @paramimgPath

     */ 

    public voidencoderQRCode(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 argsthe command line arguments

     */ 

    public static voidmain(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"); 

    } 

 

下面是生产生成好的二维码


可用手机二维码扫描软件 对运行后生成的二维码图片进行验证

下面是解码代码

【二】、解码:

 QRCodeDecoderHandler.java

Java代码 

package michael.qrcode; 

 

importjava.awt.image.BufferedImage; 

import java.io.File; 

import java.io.IOException; 

 

import javax.imageio.ImageIO; 

 

importjp.sourceforge.qrcode.QRCodeDecoder; 

importjp.sourceforge.qrcode.data.QRCodeImage; 

importjp.sourceforge.qrcode.exception.DecodingFailedException; 

 

/**

 * @blog http://sjsky.iteye.com

 * @author Michael

 */ 

public class QRCodeDecoderHandler{ 

 

    /**

     * 解码二维码

     * @paramimgPath

     * @returnString

     */ 

    public StringdecoderQRCode(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(newString(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 argsthe command line arguments

     */ 

    public static voidmain(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 J2SEImageimplements 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!!!

1 0