パスワードを忘れた? アカウント作成
169408 journal

Livingdeadの日記: PythonプログラムでQRコードを作るライブラリ三種

日記 by Livingdead

PythonプログラムからQRコードを作る必要が出てきたので、ライブラリがないか探してみた。三種見つかったうちの一つ目、pyqr (import qr として使う)。まず最初にたぶんpyqr-0.1.2.tgzは悪くない。依存ライブラリをちゃんとビルドしなかった俺が悪いので、失敗例としてダメな手順を書いておく。

1)Visual C++ 2008 Express Editionが入ったノートパソコンで何も考えずに C:\Python26\python.exe setup.py build_ext とする。cl.exeを見つけてくれてコンパイルしようとしてくれるのだがエラーになる。メッセージ忘れた。反射的にgccでコンパイルしなきゃと思う。

2)そういえば Eclipse Galileo の Pleiades Ultimate エディションが入っていたっけ、そこにはMinGWが同梱されてたよな、と思いつく。パスを通して C:\Python26\python.exe setup.py build_ext -c mingw32 とする。なんか gd.h が無いとか言ってる。そりゃWindowsだもの、そんなものないわ。

3)gd をとってくる。apt-get で、じゃなくてどっかからとってこなければ。今の本家サイトを探し出す。ちなみにGD Graphics Libraryは昔のサイトのようだ。

GD is an open source code library for the dynamic creation of images by programmers. GD creates PNG, JPEG and GIF images, among other formats. GD is commonly used to generate charts, graphics, thumbnails, and most anything else, on the fly. While not restricted to use on the web, the most common applications of GD involve web site development.
Main Page - LibGD

面倒くさがり屋なのでバイナリを探す。gd-2.0.34-win32.zipがAlらしい。最新は2.0.36RC1なんだけどな、まぁいいか。展開する。ふむ、ライブラリは*.libしか入ってないぞ。2.0.33ならGd for Windowsからバイナリが落とせるな。でも 26 August 2005 って古すぎるかも。libgd.def, libgd.dll.a, libgd.lib, libgd-bcc.lib が入ってる。おお、Borland C++用のインポートライブラリも入っているのか。ちなみにDLLの方はfreetype6.dll, jpeg62.dll, libgd2.dll, libiconv2.dll, libpng13.dll, xpn4.dllが入っている。インストーラによってC:\Program Files\GnuWin32\以下にインストールされるので、環境変数C_INCLUDE_PATHとLIBRARYをそれぞれC:\Program Files\GnuWin32\includeとC:\Program Files\GnuWin32\libに設定しておく。PATHもC:\Program Files\GnuWin32\binに設定しておく。

4)まだ C:\Python26\python.exe setup.py build -c mingw32で怒られる。どうやらzlibが無いらしい。あーもうapt-getとかyumとかやらせろと思いつつまたもや面倒くさがりやなのでバイナリを探す。

ZLIB is a compression library compatible with the gzip format. It has been written by Jean-Loup Gailly and Mark Adler. It is free software. The official page is there, but if you are interested only in Windows 95/98/NT/2000/XP/2003 support, you have found the right place.
ZLIB DLL Home Page
dll32\zlibwapi.dll : The 32 bits DLL of ZLib 1.23
dll32\zlibwapi.lib : The 32 bits import library for the DLL of ZLib 1.23
static32\zlibstat.lib : The 32 bits statis library of zLib 1.23 for Visual C++
dll32\zlib_bor.lib : The 32 bits import library for the DLL of ZLib for Borland C++

The zlib.h must be the version from zlib123.zip / zlib-1.2.3.tar.gz

Note :
    The DLL, named zlibwapi.dll, is compatible to the old zlib.dll built
    by Gilles Vollant from the zlib 1.2.x sources, and distributed at
        http://www.winimage.com/zLibDll
    It uses the WINAPI calling convention for the exported functions, and
    includes the minizip functionality. If your application needs that
    particular build of zlib.dll, you can rename zlibwapi.dll to zlib.dll.

libz.aは無いなぁ。ということで別の場所Index of /release/mingw/mingw-zlibを漁る。ここでlibz.a, libzdll.a, zlib1.dllを見つけたのでそれを使うことにする。あとmgwz.dllつーのにもPATHが通ってなければならんらしい。

5)C:\Python26\python.exe setup.py build -c mingw32でビルドできてまだ C:\Python26\python.exe setup.py installした。確かにqr.pydってファイルができてるわ。

6)import qrしてQRコードを作成してみると、白黒のセルの状態を計算するのは問題ないんだけど画像に落とすところで変なPNGファイルができてる。やっぱりgdをまじめにビルドすべきだったか。

二つ目はsourceforgeにあるpyqrcodeプロジェクトのもの。エンコーダはlibqrencodeベースでデコーダはYanbe氏のJavaによる物を使っている。

This is about a python extension for encoding and decoding the popular matrix code created by the Japanese corporation Denso-Wave, known as Quick Response Code (qrcode). Actually, it’s a big hack! The encoder is based on Fukuchi Kentaro's libqrencode, with a small python hack from Stefano Pedemonte's PyQrCodec. On the other hand, the decoder is based on the best free and open source qrcode decoder written by Yusuke Yanbe, in java. It's built with Andi Vajda's JCC.
pyqrcode

必要なのはエンコーダの方だけ。setup.pyも用意されており、特に依存しているライブラリもなくMingWのgccでもVisual C++のclでもビルドできる。んが、エンコーダの部分だけのビルドじゃimport qrcode でエラーになる。エンコーダ部とデコーダ部は独立だから何とかなるのだろうけど面倒なので思考停止。

つーわけで、PythonでQRコードの画像ファイルを作るために結局は次のライブラリを使わせていただくことにしました。

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

なお、このページでは「return 0」という行だけ先頭がスペースではなくタブになっているので、そのままコピペするとうまく動かない。以下のようにreturn 0が最後のelif節の中にあることを確認すること。

            #/*  --- set terminator */
            if (total_data_bits<=max_data_bits-4):
                data_value[data_counter]=0
                data_bits[data_counter]=4
            elif  (total_data_bits<max_data_bits):
                data_value[data_counter]=0
                data_bits[data_counter]=max_data_bits-total_data_bits
            elif (total_data_bits>max_data_bits) :
                raise OverflowError, "Overflow error"
                return 0

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

Stableって古いって意味だっけ? -- Debian初級

読み込み中...