1. 程式人生 > >初級(上) 二維碼的生成

初級(上) 二維碼的生成

吼吼,陽仔的第一篇部落格開寫啦,以下的內容都是我從imooc上面聽課的總結,當然是只針對二維碼,作為一個初級程式媛,也是要堅持學習的。

首先,謝謝imooc網上的老師發放的免費視訊,讓我自己有了一些簡單的瞭解,

接下來,就把我的總結貼出來吧:

第一

    二維碼的分類:
         線性堆疊式二維碼:建立在一條維碼基礎之上,按需要堆積成兩條或多條,主要有:pdf417 ultraclode code 49  code16k
         矩陣式二維碼:QRCode
(最長用到的)
         郵政碼
為什麼QRCode是最長用到的呢?
下面舉些常用的二維碼格式進行對比:
     PDF417:不支援中文      DM:專利未公開,需支付專利費用      QR code:專利公開,支援中文。               
    優點:與其他二維碼相比,識讀速度快,資料密度大,佔用空間小的優勢。
接下來介紹一下QRCode:
QR Code 是由日本Denso公司於1994年研製的一種矩陣二維碼符號碼,                     全稱是:quick response code 
         
         糾錯能力有4級:L級:約可糾錯7%的資料碼字
                                                      M級:15%
                                                      Q級:25%
                                                      H級:30%
                        糾錯能力越高,可儲存的就越少
生成二維碼的三種方式:
01:
藉助第三方jar:zxing(谷歌研發的)和qrcodejar
               例項:     https://github.com/zxing/                下載原始碼

01.01提取zxing-zxing-3.3.0 中core包和javase包中的com資料夾下的內容,
有很多android的資料夾,可以不用管,忽略。因為,咱主要不是那個方向的


01.02 eclipse新建java project 命名為zxing(這個當然是自己想取什麼就取什麼名字)
src目錄下面將zxing-zxing-3.3.0 中core包和javase包中的com資料夾下的內容放了進去

01.03 將zxing專案匯出jar包

01.04  新建java project   並將之前打的zxing.jar放入其中

01.05
接下來開始編碼啦:
生成二維碼
package com.imooc.zxing;

import java.io.File;
import java.io.UnsupportedEncodingException;
import java.nio.file.Path;
import java.util.HashMap;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

/**
 * 生成二維碼
 *
 * @author yuliyang
 * @version $Id: CreateQRCode.java, v 0.1 2016年11月13日 下午1:26:37 陽仔 Exp $
 */
public class CreateQRCode {
    public static void main(String[] args) throws UnsupportedEncodingException {
        int width =300;
        int height = 300;
        //圖片格式
        String format = "png";
        //內容
        String content = "www.baidu.com";
        //定義二維碼
        HashMap map = new HashMap();
        //字元
        map.put(EncodeHintType.CHARACTER_SET, "gb2312");
        //糾錯能力
        map.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
        //邊框大小
        map.put(EncodeHintType.MARGIN, 2);
        
        //開始生成
        try {
            BitMatrix bitMatrix = new MultiFormatWriter().encode(
                content, BarcodeFormat.QR_CODE, width, height);
            File file = new File("D:/zxingimg/img1.png");
            //如果檔案不存在,則建立
            if(!file.exists()){
                file.mkdirs();
            }
            MatrixToImageWriter.writeToFile(bitMatrix, format, file);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
直接執行之後,在你的D:/zxingimg 目錄下面就會看見img.png 了,拿出手機掃一掃,就可以了
是不是超級簡單。。。。
二:我們還可以解析二維碼:
package com.imooc.zxing;

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.HashMap;

import javax.imageio.ImageIO;

import com.google.zxing.Binarizer;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.EncodeHintType;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.NotFoundException;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.BitArray;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
/**
 * 解析二維碼圖片
 *
 * @author yuliyang
 * @version $Id: ReadQRCode.java, v 0.1 2016年11月13日 下午2:19:38 陽仔 Exp $
 */
public class ReadQRCode {
    public static void main(String[] args) {
        try {
        MultiFormatReader formatReader = new MultiFormatReader();
        //獲取二維碼圖片
        File file = new File("D:/zxingimg/qrcode1.png");
        BufferedImage image = ImageIO.read(file);
        BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(
            new BufferedImageLuminanceSource(image)));
        HashMap hints = new HashMap<>();
        hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
        Result result = formatReader.decode(binaryBitmap, hints);
        System.out.println("解析結果:"+result.toString());
        System.out.println("二維碼格式型別:"+result.getBarcodeFormat());
        System.out.println("二維碼文字內容:"+result.getText());
        } catch (Exception e) {
           e.printStackTrace();
        }
        
    }
}
解析結果:


ok 到現在為止,第一種方法就成功啦!!!