QRCode二維條碼,是Quick Response Code縮寫,來自日本的國際二維條碼標準,是在1994年由日本Denso-Wave公司所發明的,此公司並保有版權但並不行使版權,所以在使用QRCode上並沒有版權上的問題。QRCode的應用像是購物消費、資料查詢、名片交換等等,在日本使用上是十分常見的,而台灣在近幾年也開始流行了起來。
更詳細的QRCode介紹可以參考Wiki QR碼或是 行動條碼 / 二維碼 / Mobile Barcode / QRCode。
要利用Java來產生QRCode可以使用swetake所開放出來的原始碼http://www.swetake.com/qr/index-e.html,有php、ruby及Java等版本,下載點qrcode_java0.50beta10.tar.gz ,下載後解壓縮,可以直接把lib目錄下的QRcode.jar直接引用到程式classpath裡就可以了,或著把所有src目錄裡的java檔copy到專案source目錄裡也可。
Eclipse的配置如下圖
如何使用swetake來產生QRCode,主要的程式碼如下:
此程式主要在產生QRCode的方塊內容,其中字串str為要放入二維條碼內的資料,如果需要輸出成檔案格式則可使用return後面所保留的程式碼使用ImageIO.write來寫入檔案。
package yku.qrcode; import java.awt.*; import java.awt.image.*; //import javax.imageio.*; public class EnCodeTest { public BufferedImage makeqrcode() { // 設定圖檔寬度 140*140 BufferedImage bi = new BufferedImage(140, 140, BufferedImage.TYPE_INT_RGB); try { // Constructor Qrcode Object com.swetake.util.Qrcode testQrcode = new com.swetake.util.Qrcode(); //容錯率L M Q H testQrcode.setQrcodeErrorCorrect('M'); //字元模式,N A 或其它的A是英文,N是數字,其它是8 byte testQrcode.setQrcodeEncodeMode('B'); //可使用的字串長短跟所設定的QrcodeVersion有關,越大可設定的字越多 //0-40,0是自動 testQrcode.setQrcodeVersion(7); // 設定QR Code 編碼內容 String str = "123\r\n"; str = str + "哈哈哈 .\n"; str = str + "看的到我寫什麼嘛\n"; str = str + "我是yku啦"; // 把字串變成byte陣列 byte[] d = str.getBytes("Utf-8"); // createGraphics Graphics2D g = (Graphics2D) bi.getGraphics(); // set background g.setBackground(Color.WHITE); g.clearRect(0, 0, 140, 140); // 設定字型顏色 => BLACK g.setColor(Color.BLACK); // 轉出 Bytes if (d.length > 0 && d.length < 120) { boolean[][] s = testQrcode.calQrcode(d); for (int i = 0; i < s.length; i++) { for (int j = 0; j < s.length; j++) { if (s[j][i]) { g.fillRect(j * 3 + 2, i * 3 + 2, 3, 3); } } } } g.dispose(); // bi.flush(); // 如需輸出成檔案可利用以下方式 // 設定 產生檔案路徑 // String FilePath="c:\\TestQRCode.svg"; // File f = new File(FilePath); // 產生TestQRCode JPG File // ImageIO.write(bi, "jpg", f); } // end try catch (Exception e) { e.printStackTrace(); } // end catch return bi; } }
此程式是產生一個QRCode圖型的BufferedImage,再把BufferedImage資料利用MediaTracker載入(Applet程式一定要使用此方法,Application則可用可不用),然後利用paint函數把圖檔drawImage到JPanel上去。
package yku.qrcode; import java.awt.BorderLayout; import javax.swing.JPanel; import javax.swing.JFrame; //import java.awt.Dimension; public class GUIDisplay extends JFrame { public static void main(String args[]) { GUIDisplay d = new GUIDisplay(); d.setVisible(true); } private static final long serialVersionUID = 1L; private JPanel jContentPane = null; private java.awt.image.BufferedImage image = null; /** * This is the default constructor */ public GUIDisplay() { super(); initialize(); EnCodeTest qrcode = new EnCodeTest(); try { java.awt.MediaTracker mt = new java.awt.MediaTracker(this); // for Applet, change the method to retrieve the image // and of course use your own image! image = qrcode.makeqrcode(); mt.addImage(image, 0); mt.waitForID(0); } catch (Exception e) { e.printStackTrace(); } } /** * This method initializes this * * @return void */ private void initialize() { this.setSize(300, 307); this.setContentPane(getJContentPane()); this.setTitle("JFrame"); } /** * This method initializes jContentPane * * @return javax.swing.JPanel */ private JPanel getJContentPane() { if (jContentPane == null) { jContentPane = new JPanel(); jContentPane.setLayout(new BorderLayout()); } return jContentPane; } public void update(java.awt.Graphics g) { paint(g); } public void paint(java.awt.Graphics g) { if (image != null) { g.drawImage(image, 20, 50, this); } else { g.clearRect(0, 0, getSize().width, getSize().height); } } } // @jve:decl-index=0:visual-constraint="10,10"
結果畫面:
相關資料:
產生QRCode(EnCode)網站有:
- kaywa
- QuickMark (可編4種碼:QuickMark、QRCode、Datamatrix Mobile、中移QR碼)
- Online QR Code Generator
解讀QRCode(DeCode)網站或設備:
- 手機版QR碼解碼軟體
- QR Code Reader Windows版/Moblin版/Android版 QR碼及漢信碼解碼軟體下載
請問我想請教,關於所附的範例檔案,
當我import 到 Eclipse時,裡面的中文註解都是亂碼,請問我該如何處理?
是有幾個方法
一.
1.利用notepad++等可開啟utf8編碼的文字編輯器
2.開啟java或jsp檔,複製內容(應該中文正確)貼到Eclipse編輯內容裡
有點呆,可是很實用,建議用這種
二.改變程式編碼
1.jsp的話可利用文件上方的contentType=”text/html; charset=UTF-8″
pageEncoding=”UTF-8″ 改成big5等編碼,再重開程式
(幾乎不太可能有做用)
2.選擇程式按右鍵選Properties在Resource 的Text File Encode選MS950或是UTF-8或BIG5(我也忘了我程式設成那種編碼了)
等等等
第二種方式也可試看看把整個專案的編碼改了
您好,我想請問,為何我直接複製版大您的Code,卻無QRcode的圖示產生。
有JFrame視窗跳出,但只是空白視窗,白色的background。
我有在paint方法中檢測image的null值,顯示是無NULL。
感謝抽空給予解惑。
我把原始檔的下載連結修好了
你先下載原始檔看看
如果還有問題再請告知
如果可以跟我講Exception是什麼那就更好了
你好,請問如果要設定讀取出來的文字是什麼要怎麼設定?
例如:當解碼的文字是”123″,則進行下一步
這樣怎麼做?
這個範例是encode你需要decode的程式才能處理喔
http://code.google.com/p/zxing/ 是個有decode及encode功能的framework喔
不好意思想請問一下,
我把這個範例程式在eclipse匯入之後要執行
可是程式裡面沒有main
所以不知道該怎麼樣產生JFrame出來
所以想請問樓主該怎麼做
謝謝你
你好.
我想問一下,QRCODE有javascript寫的嗎??
我上去了www.webqr.com 看到有sources,,但我不知道怎樣把decode那個連去php
請問一下,要怎嚜把lib目錄下的QRcode.jar引用到程式classpath裡,小弟剛接觸eclipse還不太懂,謝謝
你可以參考這篇
http://blog.yslifes.com/archives/180
可以問一下,字數的限制 要怎改,都只能產生一點點中文字,是lib裡面本來就提供不多嗎?
我看到裡面有寫版本,去設定也是依樣耶
@Stan, 原來是改版本 根長度那邊,我已經 會了 謝謝
你好!!可以請問,可以跟你要你的java程式碼研究嗎??
我都有提供喔…在中文的最後端部份
你可以自已下載^^
請問你有”解”QR code的原始程式碼嗎?
我在網路上找很久都找不到可以用的
麻煩你了
http://code.google.com/p/zxing/
zxing是一個google開放原始碼的orcode framework
解碼跟編碼都有喔!可以使用看看
你好! 請問在這個程式碼中如何設定, 能控制QR Code的圖形大小? 謝謝!
算可以,也算不可以
基本上他產生的大小會依內容及參數改變
不過你可以自己把它縮成想要的大小,只要掃的到就好
@yku,
感謝大大的回覆. 我昨夜試了好久, 終於發現程式中的
J*3+2…. 3是所有boolean正方形的邊長, 2是QRCode的外圍白色的寬度,
所以如果式子中的3全部改為6的話, 產出的QRCode就會是原來的兩倍大,
希望與你分享.
你好,我想請問有關QR CODE編碼的問題
因為我也有在研究QR CODE這方面,
但是還是不太了解reed-solomon code是如何編碼的
我目前了解的是先將訊息轉換成二進制後會得到一串111011………..01011,
然後每八個位元一組,之後應該是要做reed-solomon code的編碼
但我還是不太了解他編碼的方式及步驟或是使用的參數….等等
希望大大能替我解惑..謝謝!!
大大,
可以提供您的QRCODE.JAVA的範例讓我們參考一下嗎?
謝謝您…