旁白:
由於工作需要,要做一個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有依賴了。
讀者可以試試別的版本,這里有個鏈接可以解釋的:
喜歡追求技術真諦的小伙伴們可以研究下啊。