• このエントリーをはてなブックマークに追加

はじめに

ちょっとバーコードな画像を生成をする機会があったので,ちょっと汎用化してみテスト.

コマンドラインで実行

% plackup -s Starman --port 5000 -MGD::Barcode -MGD::Image -MPlack::Request -e 'my $app = sub { my $q = Plack::Request->new(shift)->query_parameters(); my ($c,$m,$r,$h,$nt) = split(/:/,$q->get("q")||""); my $bc = GD::Barcode->new($m||"EAN13",$c) or return [500,["Content-Type"=>"text/plain"],[$GD::Barcode::errStr]]; my ($i0,$i1) = ($bc->plot(Height=>$h,NoText=>$nt)); my ($w0,$h0) = $i0->getBounds(); my ($w1,$h1) = (int($w0*($r||1)),int($h0*($r||1))); $i1 = GD::Image->new($w1,$h1); $i1->copyResized($i0,0,0,0,0,$w1,$h1,$w0,$h0); return [200,["Content-Type"=>"image/png"],[$i1->png]]; }'

これを実行して,サーバを起動します.

/Users/issm/Dropbox/blogdrafts/2011 % plackup -s Starman --port 5000 -MGD::Barcode -MGD::Image -MPlack::Request -e 'my $app = sub { my $q = Plack::Request->new(shift)->query_parameters(); my ($c,$m,$r,$h,$nt) = split(/:/,$q->get("q")||""); my $bc = GD::Barcode->new($m||"EAN13",$c) or return [500,["Content-Type"=>"text/plain"],[$GD::Barcode::errStr]]; my ($i0,$i1) = ($bc->plot(Height=>$h,NoText=>$nt)); my ($w0,$h0) = $i0->getBounds(); my ($w1,$h1) = (int($w0*($r||1)),int($h0*($r||1))); $i1 = GD::Image->new($w1,$h1); $i1->copyResized($i0,0,0,0,0,$w1,$h1,$w0,$h0); return [200,["Content-Type"=>"image/png"],[$i1->png]]; }' 
2011/02/17-09:57:41 Starman::Server (type Net::Server::PreFork) starting! pid(83680)
Binding to TCP port 5000 on host *
Setting gid to "20 20 20 401 402 204 100 98 81 80 79 61 12 103"
Starman: Accepting connections at http://*:5000/

URLの書式

サーバが起動したら,次のような書式でURLを入力すれば,何らかのバーコード画像が生成されます.

http://localhost:5000/?q={コード文字列}:{種別}:{倍率}:{バーの高さ}:{テキスト非表示}

実行例

EAN13形式

http://localhost:5000/?q=123456789012
ss-1297903037

種別を省略した場合,EAN13形式がデフォルトとなります.

http://localhost:5000/?q=123456789012:EAN13
ss-1297903098

画像の倍率

http://localhost:5000/?q=123456789012:EAN13:3
ss-1297903150

省略すると「1倍」が適用されます.

バーの高さ

http://localhost:5000/?q=123456789012:EAN13:3:30
ss-1297903194

省略すると,GD::Barcode::* でのデフォルト値が使われます.

テキスト非表示

http://localhost:5000/?q=123456789012:EAN13:3:30:1
ss-1297903226

省略すると表示されます.

Code39形式の例

http://localhost:5000/?q=HOGE-1234-FUGA:Code39:2:50
ss-1297903290

参考

おわりに

GD::Barcode 便利ですね!

おまけ: コード部分を整形

先のコマンドラインにおけるコード部部分は,こんな感じです.

my $app = sub {
    my $q = Plack::Request->new(shift)->query_parameters();
    my ($c, $m, $r, $h, $nt) = split ( /:/, $q->get("q") || "" );
 
    my $bc = GD::Barcode->new( $m || "EAN13", $c )
        or return [
            500,
            [ "Content-Type" => "text/plain" ],
            [ $GD::Barcode::errStr ]
        ];
 
    my ( $i0, $i1 ) = (
        $bc->plot( Height => $h, NoText => $nt )
    );
    my ( $w0, $h0 ) = $i0->getBounds();
    my ( $w1, $h1 ) = (
        int( $w0 * ($r || 1) ),
        int( $h0 * ($r || 1) )
    );
 
    $i1 = GD::Image->new($w1, $h1);
    $i1->copyResized(
        $i0,
        0, 0, 0, 0,
        $w1, $h1, $w0, $h0
    );
 
    return [
        200,
        [ "Content-Type" => "image/png" ],
        [ $i1->png ]
    ];
}