二維碼的生成和解碼Java實現

lplo 9年前發布 | 9K 次閱讀 Java

涉及到的一些主要類庫,方便大家下載:

  • 二維碼編碼lib:Qrcode_swetake.jar(官網介紹 -- http://www.swetake.com/qr/index-e.html)
  • 二維碼解碼lib:qrcode.jar (官網介紹 -- http://sourceforge.jp/projects/qrcode/)

java二維碼 生成二維碼 QRCodeEncoderHandler.java

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://zhblog.github.com/blog
  • @author zzh */ 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("utf-8");
      
       BufferedImage bufImg = new BufferedImage(140, 140,
               BufferedImage.TYPE_INT_RGB);
      
       Graphics2D gs = bufImg.createGraphics();
      
       gs.setBackground(Color.cyan);
       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 = "./zzh.png";

      String content = "\t江湖在喝酒的路上"

           + "\nMyblog  :http://zhblog.github.com/blog"
           + "\nEMail   :jack.zh.1986@gmail.com"
           + "\nQQ      :715443050";
      
      

      QRCodeEncoderHandler handler = new QRCodeEncoderHandler(); handler.encoderQRCode(content, imgPath); System.out.println("encoder QRcode success"); } }</pre>

      java二維碼解碼 QRCodeDecoderHandler.java

      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://zhblog.github.com/blog
  • @author zzh */ 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)));
      

      } 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 = "zzh.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);
      

      }

      } }</pre>

 本文由用戶 lplo 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!