java二維碼小試牛刀


旁白:

  由於工作需要,要做一個java的二維碼的圖片,花了2天的時間學習了一下,過程中也遇到了一些問題,這里做個筆記,收藏了。

廢話不多說了,入題吧!

轉自:http://www.open-open.com/lib/view/open1355055725476.html

概念:

  二維碼,又稱 二維條碼二維條形碼最早發明於日本,它是用某種特定的幾何圖形按一定規律在平面(二維方向上)分布的黑白相間的圖形記錄數據符號信息的,在代碼編制上巧妙地利用構成計算機內部邏輯基礎的“0”、“1”比特流的概念,使用若干個與二進制相對應的幾何形體來表示文字數值信息,通過圖象輸入設備或光電掃描設備自動識讀以實現信息自動處理。它具有條碼技術的一些共性:每種碼制有其特定的字符集;每個字符占有一定的寬度;具有一定的校驗功能等。同時還具有對不同行的信息自動 識別功能、及處理圖形旋轉變化等特點。

1.java這邊的話生成二維碼有很多開發的jar包如zxing,qrcode(前者是谷歌開發的后者則是小日本開發的,這里的話我使用zxing的開發包來弄。

  ZXing項目是google code上面提供的一個關於條碼編解碼的開源項目。
2.先下載zxing開發包,這里用到的只是core那個jar包(這里需要j2me和core兩個包)
這里說一下zxing的下載:

1. 源碼zip包的下載地址為:http://code.google.com/p/zxing/要對項目進行二次開發,首先你需要在源碼下載列表中下載ZXing的zip源代碼解壓文件,你會看到里面有很多文件夾,包括J2SE的,Android的,J2ME,C#等等。這里以J2SE為例。需要使用里面的Core和J2SE文件夾。然后導入到你在Eclipse中創建的工程。

上面的方式需要粘入相當多的代碼,個人不太喜歡,所以上面的解決方案就是把上面的東西寫到一個單獨的java project里打個jar包,就很方便了。

2. 與其打個jar包不如直接下載一個jar不就解決了嗎,OK,呦呦,這個主意不錯,靈感突發滴結果!哦耶!BU...T,JAR哪里找呢,哪里找啊哪里找!哎....!

地址就是:http://mvnrepository.com/artifact/com.google.zxing(里面版本自己找吧,這里提醒讀者,2.3的話好像是對jdk1.7有依賴了,如果閣下的是1.7前的,2.2版是沒問題的,這個我已經測試過了!)

A. core為zxing的核心代碼,包括encode和decode的代碼;

B. javase可以定義為一個輔助代碼,主要提供一些工具類。

比如:讀取image的代碼類ImageReader、寫image到文件的類MatrixToImageWriter。充分使用zxing的javase模塊提供的工具類,既方便了代碼的編寫工作,又避免了上網找一些類似的代碼。

代碼:

使用zxing開發還需要一個類,代碼如下(原作者代碼寫出的圖片中用手機掃出的漢字為亂碼問題,這里做了修改):

package com.horizon.action;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Hashtable;

import javax.imageio.ImageIO;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.ReaderException;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;

public class TestEnDeCode {

    public TestEnDeCode() {
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        TestEnDeCode t = new TestEnDeCode();
        t.encode();
        t.decode();
    }

    // 編碼
    public void encode() {
        try {
            String str = "CN:男;COP:公司;ZW:職務";// 二維碼內容
            String path = "D:\\hwy.png";
            BitMatrix byteMatrix;
            byteMatrix = new MultiFormatWriter().encode(
                 // 在Zxing轉碼之前,手動轉碼,避免了中文亂碼的錯誤
new String(str.getBytes(), "iso-8859-1"), BarcodeFormat.QR_CODE, 200, 200); File file = new File(path); MatrixToImageWriter.writeToFile(byteMatrix, "png", file); } catch (Exception e) { e.printStackTrace(); } } // 解碼 public void decode() { try { String imgPath = "D:\\hwy.png"; File file = new File(imgPath); BufferedImage image; try { image = ImageIO.read(file); if (image == null) { System.out.println("Could not decode image"); } LuminanceSource source = new BufferedImageLuminanceSource(image); BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer( source)); Result result; Hashtable<DecodeHintType, String> hints = new Hashtable<DecodeHintType, String>(); hints.put(DecodeHintType.CHARACTER_SET, "UTF-8"); result = new MultiFormatReader().decode(bitmap, hints); String resultStr = result.getText(); System.out.println(resultStr); } catch (IOException ioe) { System.out.println(ioe.toString()); } catch (ReaderException re) { System.out.println(re.toString()); } } catch (Exception ex) { } } }

問題總結:

1. ZXing掃描二維碼出現中文亂碼的問題:

 ZXing掃條形碼沒有問題,但是掃描二維碼的時候卻有一部分是亂碼,或者不是中文的問題。

只要以ISO-8859-1的格式來編碼,取出結果再進行相應的轉換,問題就解決了,並不需要修改源碼,可以參考上面的代碼。

2. 報錯:java.lang.UnsupportedClassVersionError: com/google/zxing/client/j2se/MatrixToImageWriter

遇到這個問題的話,98%的概率是JDK的版本與ZXing版不搭了,上面已經說過了,2.2版本在JDK1.6應該是沒問題的,2.3的話應該是對JDK1.7有依賴了。

讀者可以試試別的版本,這里有個鏈接可以解釋的:

http://stackoverflow.com/questions/4839734/java-unsupported-major-minor-version-49-0-where-is-it-coming-from

喜歡追求技術真諦的小伙伴們可以研究下啊。

代碼下載地址:http://download.csdn.net/detail/tvcctv27tv/6840955


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM