« ネタとして欲しいなぁ | メイン | RQR »

2006年8月21日

QR コード生成モジュール

Category: Perl

qrgen_sample.png

CPAN よりダウンロード可能な GD::Barcode モジュールを利用すれば Perl で QR コードを作成出来るので備忘録も兼ねてサンプルスクリプトを以下に紹介します。必要であれば同じものを上記リンクよりダウンロードできます(このスクリプトを実行したものが貼られている QR コードです)。利用の際はファイル名を qrgen.pl に変えてご利用下さい。QR コード生成スクリプトは私も作ろうと思っていたので、非常にありがたいです。

サンプルではセルサイズを自動で設定できるようにしました。モジュール自体で自動設定してくれるはずなのですが、何が悪いのかよく分かりませんがうまく設定してくれませんでしたので自分で実装しました。英数字だけですともっとたくさん文字数かけるのですが、処理が面倒なのでバイナリデータを想定しています。また、日本語文字コードは携帯で読むことを考えて Jcode.pm を用いて Shift-JIS に変換するようにしました。私の覚え書きのようなものですのでこのスクリプトをそのまま使って頂いても構いません(特に謝辞も要りませんし著作権も主張しません)ので利用価値があると思われる方はご自由にどうぞ。

#!/usr/bin/perl use GD::Barcode::QRcode; use Jcode; use strict; use vars qw( @Cells $min_size $str $version $ECC ); binmode(STDOUT); ############################################################################# # 以下ユーザーによる設定 # # $min_size : 作成する画像の最低サイズ (ピクセル, 負で最小サイズ) # $version : QR コードのサイズ(level 1-40, 0: 自動設定) # $ECC : エラー訂正レベル # L(7%), M(15%), Q(25%), H(30%) # $str : 埋め込む文字列 # $min_size = 100; $version = 0; $ECC = 'M'; $str = <<"END"; ここに文字列を入力します。改行も OK 下の END は消さないように !! END # 以上設定終了 ############################################################################# # 文字列の日本語を Shift-JIS に変換 $str = Jcode::convert( \$str, 'sjis' ); # QR コードのレベルを自動設定 if( $version < 1 || $version > 40 ){ $version = &SetVersion( $ECC, $str ); exit if( $version < 0 ); # 文字数制限オーバー } # QR コードのサイズ設定 my $ModuleSize = 1; if( $Cells[$version-1] < $min_size ){ $ModuleSize = int( $min_size / $Cells[$version-1] ) + 1; } # QR コードの作成 my $QR = new GD::Barcode::QRcode( $str, { Ecc => $ECC, ModuleSize => $ModuleSize, Version => $version } ); print $QR->plot->png; # 初期データ BEGIN{ # 各レベル毎のセル数 @Cells = qw( 21 25 29 33 37 41 45 49 53 57 61 65 69 73 77 81 85 89 93 97 101 105 109 113 117 121 125 129 133 137 141 145 149 153 157 161 165 169 173 177 ); } sub SetVersion{ my ( $ECC, $STR ) = @_; # 各レベル毎の最大データ容量(バイナリデータの場合) my @MaxByte = ( { 'L' => 17, 'M' => 14, 'Q' => 11, 'H' => 7 }, { 'L' => 32, 'M' => 26, 'Q' => 20, 'H' => 14 }, { 'L' => 53, 'M' => 42, 'Q' => 32, 'H' => 24 }, { 'L' => 78, 'M' => 62, 'Q' => 46, 'H' => 34 }, { 'L' => 106, 'M' => 84, 'Q' => 60, 'H' => 44 }, { 'L' => 134, 'M' => 106, 'Q' => 74, 'H' => 58 }, { 'L' => 154, 'M' => 122, 'Q' => 86, 'H' => 64 }, { 'L' => 192, 'M' => 152, 'Q' => 108, 'H' => 84 }, { 'L' => 230, 'M' => 180, 'Q' => 130, 'H' => 98 }, { 'L' => 271, 'M' => 213, 'Q' => 151, 'H' => 119 }, { 'L' => 321, 'M' => 251, 'Q' => 177, 'H' => 137 }, { 'L' => 367, 'M' => 287, 'Q' => 203, 'H' => 155 }, { 'L' => 425, 'M' => 331, 'Q' => 241, 'H' => 177 }, { 'L' => 458, 'M' => 362, 'Q' => 258, 'H' => 194 }, { 'L' => 520, 'M' => 412, 'Q' => 292, 'H' => 220 }, { 'L' => 586, 'M' => 450, 'Q' => 322, 'H' => 250 }, { 'L' => 644, 'M' => 504, 'Q' => 364, 'H' => 280 }, { 'L' => 718, 'M' => 560, 'Q' => 394, 'H' => 310 }, { 'L' => 792, 'M' => 624, 'Q' => 442, 'H' => 338 }, { 'L' => 858, 'M' => 666, 'Q' => 482, 'H' => 382 }, { 'L' => 929, 'M' => 711, 'Q' => 509, 'H' => 403 }, { 'L' => 1003, 'M' => 779, 'Q' => 565, 'H' => 439 }, { 'L' => 1091, 'M' => 857, 'Q' => 611, 'H' => 461 }, { 'L' => 1171, 'M' => 911, 'Q' => 661, 'H' => 511 }, { 'L' => 1273, 'M' => 997, 'Q' => 715, 'H' => 535 }, { 'L' => 1367, 'M' => 1059, 'Q' => 751, 'H' => 593 }, { 'L' => 1465, 'M' => 1125, 'Q' => 805, 'H' => 625 }, { 'L' => 1528, 'M' => 1190, 'Q' => 868, 'H' => 658 }, { 'L' => 1628, 'M' => 1264, 'Q' => 908, 'H' => 698 }, { 'L' => 1732, 'M' => 1370, 'Q' => 982, 'H' => 742 }, { 'L' => 1840, 'M' => 1452, 'Q' => 1030, 'H' => 790 }, { 'L' => 1952, 'M' => 1538, 'Q' => 1112, 'H' => 842 }, { 'L' => 2068, 'M' => 1628, 'Q' => 1168, 'H' => 898 }, { 'L' => 2188, 'M' => 1722, 'Q' => 1228, 'H' => 958 }, { 'L' => 2303, 'M' => 1809, 'Q' => 1283, 'H' => 983 }, { 'L' => 2431, 'M' => 1911, 'Q' => 1351, 'H' => 1051 }, { 'L' => 2563, 'M' => 1989, 'Q' => 1423, 'H' => 1093 }, { 'L' => 2699, 'M' => 2099, 'Q' => 1499, 'H' => 1139 }, { 'L' => 2809, 'M' => 2213, 'Q' => 1579, 'H' => 1219 }, { 'L' => 2953, 'M' => 2331, 'Q' => 1663, 'H' => 1273 } ); my $len = length( $STR ); for( my $i = 0 ; $i < 40 ; $i++ ){ if( $len < $MaxByte[$i]->{$ECC} ){ return $i+1; } } return -1; }

投稿者 kato : 2006年8月21日 05:36

トラックバック

このエントリーのトラックバックURL:
http://cachu.xrea.jp/MT/mt-tb-1328e30.cgi/771

コメント

おお... GDモジュールでこんなことが出来たのですね。確かにGD::Barcode ってのはどこかで見かけた記憶があったのですが,QRcode は前々からありましたっけ?

以前JISの仕様書を手に入れてそのうち遊んでみようとおもいつつ結局そのまま放置(一通り目はとおしたんだけど...)していたのですが,こういうモジュールになっているならお手軽だなぁ(^_^). 

投稿者 mym : 2006年8月24日 08:15

> QRcode は前々からありましたっけ?
Changes によりますと QRcode はバージョン 1.15 (2004/4/24)よりサポートされたようです。
現在の GD::Barcode モジュールのバージョンは 1.15 ですので最新版で対応しているということですね。

> 以前JISの仕様書を手に入れてそのうち遊んでみよう
その時は黒塗りの PS をごにょごにょするのにいい知恵を与えて頂き感謝しております。

投稿者 きゃちゅ : 2006年8月25日 17:39

コメントしてください




保存しますか?