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

Posted in Java, opensource, 影像處理, 程式 on 2010/6/28 by yku 瀏覽:355人次 — 更多回應

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碼及漢信碼解碼軟體下載


Related Posts with Thumbnails

一個回應 to “[Java]如何產生Qrocde二維條碼?”

PingBack List:

  1. [Java]QRCode產生VCard

留下您想說的話: