今まで GD::Barcode::QRcode の独壇場だった QR Codeを Perl で作るためのライブラリですが、ここで一つ対抗馬として、Imager::QRCodeを作って、CPAN に上げてみました。

G::B::QRcode と比べて良いところは以下。
  • 出来上がったものはそのままImagerのオブジェクトになっているため、出来た画像に対していろいろできます。
  • 白黒の部分の色を Imager::Color で指定できるようになっていますので、白地に緑とか青とか赤とかの QR code ができちゃったりします。
  • GDなどのインストールはいりません。libqrencodeという小さなライブラリを入れるだけでさくっと動きます。
ただ、ぶっちゃけちゃうと GD::Barcode::QRcode よりも速度が若干遅いです。
以下ベンチマークになります(ベンチマークプログラムは最後に載せています)。
Benchmark: timing 100 iterations of G::B::QRcode, I::QRCode::plot, I::QRCode::plot_qrcode...
G::B::QRcode:  1 wallclock secs ( 0.01 usr +  1.64 sys =  1.65 CPU) @ 60.61/s (n=100)
I::QRCode::plot:  2 wallclock secs ( 0.67 usr  1.57 sys +  0.28 cusr  0.14 csys =  2.66 CPU) @ 44.64/s (n=100)
I::QRCode::plot_qrcode:  3 wallclock secs ( 0.79 usr  1.35 sys +  0.33 cusr  0.15 csys =  2.62 CPU) @ 46.73/s (n=100)
                         Rate I::QRCode::plot I::QRCode::plot_qrcode G::B::QRcode
I::QRCode::plot        44.6/s              --                    -4%         -26%
I::QRCode::plot_qrcode 46.7/s              5%                     --         -23%
G::B::QRcode           60.6/s             36%                    30%           --
G::B::QRcodeの 60% ぐらいしか速度でませんが、QR Code の生成はそんな頻繁ではないと思うので速度は御勘弁を…。
といいつつ、もうちょっと早くならないか考え中です。

use strict;
use GD::Barcode::QRcode;
use Imager::QRCode;
use Benchmark qw(timethese cmpthese);
use Encode;

my $count = 100;
my $text = encode('cp932', decode('utf8', 'これはテストです'));
cmpthese(timethese($count, {
    'G::B::QRcode' => sub {
        my $oGdBar = GD::Barcode::QRcode->new(
            $text, {
                Ecc        => 'L',
                Version    => 2,
                ModuleSize => 2,
            }
        );
        open(my $fh, '>', 'gd-barcode-qrcode.gif');
        print $fh $oGdBar->plot->gif;
        close($fh);
    },
    'I::QRCode::plot' => sub {
        my $qrcode = Imager::QRCode->new(
            level   => 'L',
            version => 2,
            size    => 2,
        );
        my $img = $qrcode->plot($text);
        $img->write(file => 'imager-qrcode-plot.gif');
    },
    'I::QRCode::plot_qrcode' => sub {
        my $img = Imager::QRCode::plot_qrcode($text, {
            level   => 'L',
            version => 2,
            size    => 2,
        });
        $img->write(file => 'imager-qrcode-plot_qrcode.gif');
    },
}));