2006-12 / 2006-12-12

前のエントリ: もつ鍋 [diary]
次のエントリ: ActivePerlでLF(0x0a)単体の出力 [perl]

GD::Barcode::QRcodeでQRコード作成
2006-12-12-1 / カテゴリ: [携帯][win][cygwin][perl] / [permlink]

約1年明けての検証…[2006-01-10-2]

cpan> install GD::Barcode::QRcode
cpan> install GD
cygwin環境での GD のビルドには libgd-devel パッケージ(cygwinパッケージ)が必要(gdも?)

基本
use GD::Barcode::QRcode;

binmode STDOUT;
print GD::Barcode::QRcode->new('foobarbaz')->plot->png;
とりあえずこれで、PNGのバイナリが出力される。(結果はリダイレクトする)
ただし何のオプションも指定しない場合は、デフォルトのQRコードバージョン:1 になり、128bit以上の元データに対して
Overflow error. version 1
total bits: 132  max bits: 128
とエラーになる(ので使い物にならない)。
この状態でエンコードできるデータ量は単純に128/8==16バイトではなく、数値を与えるかasciiを与えるか等で指定可能バイト数が変化する。モジュール内部で対象データを自動判別している模様。

コンストラクタ時にQRコードバージョン・誤り訂正レベル・出力画像サイズが指定できるので、ハッシュのリファレンスでパラメタを与えてやる。
my $qr = new GD::Barcode::QRcode->new(
                                      'http://www.jp-z.jp/',
                                      { Ecc=>'L', Version=>2, ModuleSize=>2} );
print $qr->plot()->png();

Ecc は誤り訂正レベル
レベル訂正能力
L約7%
M約15%
Q約25%
H約30%
未指定時は M になるっぽい。誤り訂正レベルを上位にすると、符号化できるデータ量は減少する。

Version は QR コードのバージョン
未指定時は1になるっぽい。バージョンをあげると符号化できるデータ量が増加し、画像も細かくなる。バージョン増加に伴い、出力画像のピクセル数も増加する。GD::Barcode::Qrcode では、縦横4ピクセルずつの余白が付加される。
バージョン(n)に対する出力画像の1辺のピクセル数(pixel)は次のよーな感じ。
pixel = 21 + ((n - 1) * 5)
バージョン1で21x21(余白を入れた画像の解像度は29x29)。以降、バージョンを1上げるごとに5ピクセル増加。1から40まで指定可能。
バージョン・誤り訂正レベルの組み合わせによる最大入力サイズはここ
バージョンを上げると、生成するのにそれなりに負荷がかかる^^;

ModuleSize は出力画像の解像度の指定。余白を含めた画像サイズの倍率になる。未指定時・0指定時は1と同じ。縦横均等。

CGIでブラウザへの出力として使うには、(PNGであれば)HTTPヘッダで "Content-Type: image/png" を吐いて、plot()->png() を出力させれば良い(はず。未確認)。

参考
CPAN: http://search.cpan.org/~kwitknr/GD-Barcode-1.15/Barcode.pm
QRコードの作り方〜バージョンの決定〜: http://www.denso-wave.com/qrcode/qrgene2.html


V603SHのQRコード認識能力はイマイチ。au(BREW3.1)は結構高速…。デコードエンジンのつくりかな…
Referrer (Inside): [2007-02-27-1]
前のエントリ: もつ鍋 [diary]
次のエントリ: ActivePerlでLF(0x0a)単体の出力 [perl]

2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12

最終更新時間: 2013-05-02 16:12