python で QR コード作成

: back

python で QR コード作成

更新履歴

(2011.11.20)
modify L463-464 for the problem raising TypeError.(thanks to Mitsuru Sogawa and Jun Moroo.)
remove '\t' at L348.

QR コードについて

QRコードは(株)デンソーウェーブの登録商標です。
http://www.qrcode.com/

作成メモ

swetake さん(http://www.swetake.com/)が既に Perl, PHP, Ruby, Java 用のライブラリをつくってくださっているため、これを移植する。言語的に近そうなので Ruby 版を基にした。ほとんど逐語訳的となった。

http://libpanda.s18.xrea.com/qr/pyqrcode.py

つかいかた

swetake さんのライブラリで使われている qrcode_data(qrv*.dat や rsc*.dat などが入ったディレクトリ) が必要になる。http://www.swetake.com/qr/ruby/qr_rb.htmlを参考のこと。また pyqrcode.py の 24 行目でこのディレクトリへのパスを指定しているので適宜変更する。
( self.path = "./qrcode_data" # <- ここを変える )

つかいかた:

import pyqrcode
data = 'my name is じょん'
a = pyqrcode.Qrcode()
s = a.make_qrcode(data) 
print s
s は '1', '0' 及び '\n'からなる文字列であり、print すると'1' と '0' からなる正方形が表示される。これを '1' を黒いドット、 '0' を白いドットで描画すると QR コードになる。

PILを使って画像にしよう:

def main(d, out):
    from pyqrcode import Qrcode
    import Image, ImageDraw
    from math import sqrt    

    a = Qrcode()

    qrdata = a.make_qrcode(d)
    qrdata = qrdata.replace("\n","") # 改行を抜く
    qrsize = int(sqrt(len(qrdata))) # データの一辺の長さ

    cellsize = 2
    offset = 4
    sidelen = (qrsize+offset*2)*cellsize
    img = Image.new("1",(sidelen, sidelen),1)
    dr = ImageDraw.Draw(img)
    for i,d in enumerate(qrdata):
        if d == "1":
            x = i%qrsize
            y = i/qrsize
            x0 = (x+offset)*cellsize
            y0 = (y+offset)*cellsize
            x1 = x0 + cellsize-1
            y1 = y0 + cellsize-1        
            dr.rectangle((x0,y0,x1,y1),fill=0)
                           
    img.save(out,"PNG")
    return
if __name__ == "__main__":
    d = "http://libpanda.s18.xrea.com/swf/chinpolite2.swf"
    out = "chinpolite2.png"
    main(d,out)

PIL がないあなた(=わたし)へ

XREA (ここ)のサーバに PIL が入っていない。HTML の table タグで強引に描画してしまう手もあるが環境によってはブラクラとなりかねない。SWF (MacromediaAdobe Flash)で書きだせるようにした。また SWF ファイルは、バージョンによって内部が zlib を使って圧縮されているものと、されていないものがある。XREA (ここ)のサーバの Python では zlib が使えないようになっているらっし (参考)ので、try: import zlib して ImportError な場合は無圧縮でやるようにした。

http://libpanda.s18.xrea.com/qr/qrdata2swf.py

つかいかた

from pyqrcode import Qrcode
from qrdata2swf import qrdata2swf
from math import sqrt

data = "じょい name is man."

a = Qrcode()
qrdata = a.make_qrcode(data)
qrdata = qrdata.replace('\n','') # 改行を抜く
qrsize = int(sqrt(len(qrdata))) # データの一辺の長さ
maker = qrdata2swf()

f = open("output.swf","wb")
f.write(maker.make(qrdata=qrdata,qrsize=qrsize,cellsize=4))
f.close()
日本語は単なるバイト列として扱われるのでデコード側の文字コードに依存するが Shift_JIS にしておくのが良いようだ。

(c) Copyright oji minami 2005 All Rights Reserved