[Java]如何產生Qrocde二維條碼?

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目錄裡也可。

qrcode壓縮檔

Eclipse的配置如下圖

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"

結果畫面:

QRCodeFrame

 

相關資料:

  1. QRコード
  2. Java QR Code Open Source Decoder
  3. QR2DBarCode for Mobile
  4. 行動上網聯盟

產生QRCode(EnCode)網站有:

  1. kaywa
  2. QuickMark (可編4種碼:QuickMark、QRCode、Datamatrix Mobile、中移QR碼)
  3. Online QR Code Generator

解讀QRCode(DeCode)網站或設備:

  1. 手機版QR碼解碼軟體
  2. QR Code Reader Windows版/Moblin版/Android版 QR碼及漢信碼解碼軟體下載

23 thoughts to “[Java]如何產生Qrocde二維條碼?”

  1. 自動引用通知: [Java]QRCode產生VCard
  2. 請問我想請教,關於所附的範例檔案,
    當我import 到 Eclipse時,裡面的中文註解都是亂碼,請問我該如何處理?

    1. 是有幾個方法
      一.
      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(我也忘了我程式設成那種編碼了)

      等等等
      第二種方式也可試看看把整個專案的編碼改了

  3. 您好,我想請問,為何我直接複製版大您的Code,卻無QRcode的圖示產生。
    有JFrame視窗跳出,但只是空白視窗,白色的background。
    我有在paint方法中檢測image的null值,顯示是無NULL。
    感謝抽空給予解惑。

    1. 我把原始檔的下載連結修好了
      你先下載原始檔看看
      如果還有問題再請告知
      如果可以跟我講Exception是什麼那就更好了

  4. 你好,請問如果要設定讀取出來的文字是什麼要怎麼設定?
    例如:當解碼的文字是”123″,則進行下一步
    這樣怎麼做?

  5. 不好意思想請問一下,
    我把這個範例程式在eclipse匯入之後要執行
    可是程式裡面沒有main
    所以不知道該怎麼樣產生JFrame出來
    所以想請問樓主該怎麼做

    謝謝你

  6. 你好.
    我想問一下,QRCODE有javascript寫的嗎??
    我上去了www.webqr.com 看到有sources,,但我不知道怎樣把decode那個連去php

  7. 請問一下,要怎嚜把lib目錄下的QRcode.jar引用到程式classpath裡,小弟剛接觸eclipse還不太懂,謝謝

  8. 可以問一下,字數的限制 要怎改,都只能產生一點點中文字,是lib裡面本來就提供不多嗎?

    我看到裡面有寫版本,去設定也是依樣耶

  9. 請問你有”解”QR code的原始程式碼嗎?
    我在網路上找很久都找不到可以用的
    麻煩你了

  10. 你好! 請問在這個程式碼中如何設定, 能控制QR Code的圖形大小? 謝謝!

    1. 算可以,也算不可以
      基本上他產生的大小會依內容及參數改變
      不過你可以自己把它縮成想要的大小,只要掃的到就好 

      1. @yku,
        感謝大大的回覆. 我昨夜試了好久, 終於發現程式中的
        J*3+2…. 3是所有boolean正方形的邊長, 2是QRCode的外圍白色的寬度,
        所以如果式子中的3全部改為6的話, 產出的QRCode就會是原來的兩倍大,
        希望與你分享.

  11. 你好,我想請問有關QR CODE編碼的問題
    因為我也有在研究QR CODE這方面,
    但是還是不太了解reed-solomon code是如何編碼的
    我目前了解的是先將訊息轉換成二進制後會得到一串111011………..01011,
    然後每八個位元一組,之後應該是要做reed-solomon code的編碼
    但我還是不太了解他編碼的方式及步驟或是使用的參數….等等
    希望大大能替我解惑..謝謝!!

  12. 大大,
    可以提供您的QRCODE.JAVA的範例讓我們參考一下嗎?

    謝謝您…

發表迴響