QRコードを作る。

perlCPANにGD::Barcodeたるものを見つけたので遊んでみた。
QRコードをお気に召すまま作成♪

必須:

  • GD
  • GD::Barcode::QRcode
  • Getopt
  • Error

GDは(少なくともMandrivaの場合は)urpmi perl-GDで
後ろ三つはCPAN使って

# perl -MCPAN -e shell
capn> install GD::Barcode::QRcode
cpan> install Error
capn> quit

こんな感じでサクッと。
CPAN初回起動時はなんかゴチャゴチャ言われますが、とりあえず国の選択でAsia→Japan選んで適当なサーバー指定すればおっけー。(というか初回起動時に何聞かれるか覚えてないし、調べる気もない(ぉぃ


で、ソース

#!/usr/bin/perl

use strict;

use GD::Barcode::QRcode;
use Getopt::Long;
use Error qw(try);

binmode( STDOUT );

my $ecc='M';
my $help=0;
my $size=1;
my $type='text';
my $ver=1;
my $usageMessage =<<"HERE";
Usage: $0 [options]...
create QR code for STDIN.
  -e. --ecc=ECC			Ecc mode. Select 'L', 'M', 'Q' or 'H'(Default = 'M').
  -h, --help			Show this message.
  -s, --size=SIZE		Size of modules(barcode unit)(Default = 1).
  -t, --type=TYPE		Output type. Select 'png', 'gif', 'jpg' or 'text'(Default = 'text').
  -v, --version=VERSION		Version ie. size of barcode image (Default = 1).
 				VERSION may be changed automatically to fit.
HERE

#引数処理
GetOptions(
	'ecc=s' => \$ecc,
	'help' => \$help,
	'size=i' => \$size,
	'type=s' => \$type,
	'version=i' => \$ver
);

if( $help ) {
	print $usageMessage;
	exit;
}
if( $ecc !~ m/[MLHQ]/ || $type !~ m/(png|jpg|gif|text)/) {
	die $usageMessage;
}

my $text;
while( <STDIN> ) {
	$text.=$_;
}


#QRコード作成
my $lastError;
my $gdQRcode; 
retry:
my $res = eval{
	$gdQRcode = GD::Barcode::QRcode->new( $text, { Ecc=>$ecc, Version=>$ver, ModuleSize=>$size} );
};
if( !$res ) {
	#QRcode.pmがdieするのはversionの不足のみ。のはず。
	die "too large input" if $ver > 40;
	$lastError=$@;
	$ver++;
	print "$ver\n";
	goto retry;
}

#QRコード出力
if( $type eq 'png' ) {
	print $gdQRcode->plot->png;
} elsif( $type eq 'gif' ) {
	print $gdQRcode->plot->gif;
} elsif( $type eq 'jpg' ) {
	print $gdQRcode->plot->jpeg;
} elsif( $type eq 'text' ) {
	print $gdQRcode->barcode();
} else {
	#一応上の方で弾いているはずだが、念のため。
	die $usageMessage;
}
#結果。versionに変更がある可能性があるため
print STDERR "Ecc: $ecc, Version: $ver, Size: $size\n";

昔に作った物で、ついさっき手を入れようとしたらperlの書き方を忘れたというね...


一応用語の説明だけ。(とかいいつつ作ったの昔だからうろ覚え...間違ってたらスイマセン><


ECC:
誤り訂正レベル。
QRコードは撮った画像が不鮮明だったりして、一部欠損したりするものでも読み込めるのですo(д)♂
そこで、どの程度まで訂正できるようにするか、というもの。
当然誤り訂正レベルを上げれば情報量が増えるためQRコード自体は大きな物になりやすい。
印刷物とか不鮮明になりやすい場合は誤り訂正レベルを上げておくべし。
ちなみに、どれくらい訂正能力があるかと言うと、Lで7%(全体の7%が死んでもok
Mでは15%, Qで25%, Hで30%となってる。
ということで、ECCがHのQRコードなら3割程度(余裕持って2割ぐらい)の範囲に絵とか文字とかいれても読める、とかでデザインQRコードとかあったりなかったり...。


ヴァージョン:
サイズのこと。
もちサイズが出かければたくさんも文字を入れられる。
Version 1で21x21。Version 2で25x25...レベル40にもなると177x177のセル(最小の四角)となる。
とりあえず↑のソースでは小さい方から試して、入りきった最初、つまり最小のヴァージョンになるようにしてます(見ればわかるか。


と言った感じ。
使い方としては

$ qrcode
hoge[EOF] //[EOF] = End-of-File linuxではCtrl-D, WinだとCtrl-Zだっけ?
00000000000000000000000000000
00000000000000000000000000000
(略)
$ qrcode -t png -e H > "qrcode.png"
hoge[EOF]

まぁ、--helpみりゃわかると思います。


#どうでもいいけどvimに">|hoge|〜||<"用の局所シンタックスハイライトが欲しい