トップ «前の日記(■2004-07-23) 最新 次の日記(■2004-07-28)» 編集

どんぞこ日誌

2003|08|09|10|11|12|
2004|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|
2006|01|02|03|04|05|07|08|12|
2007|01|04|08|12|
2008|01|02|03|04|06|07|08|10|11|12|
2009|01|02|04|05|06|07|08|09|11|12|
2010|01|03|04|07|08|10|11|12|
2011|01|02|03|04|05|06|07|08|10|12|
2012|01|02|03|05|06|07|08|09|10|
2013|01|02|07|08|09|
2014|08|09|
2015|08|
2016|06|07|12|
2017|01|03|08|
2018|03|
2022|03|
2023|03|
2024|02|07|10|

同人関連(どんぞこ楽屋) | 旧い雑文   


■2004-07-25

* [Perl][CGI] QRコードの生成B!

 仕事場でQRコードの話になり、試しにCPANのGD::Barcode::QRcodeをいじってみました。
  さて、このモジュールはGDライブラリを使って画像を生成するわけですが、レンタルサーバなどではGDを使うのが困難やもしれません。でもよく考えると、どうせ白黒二色だけなのですから、xbm形式で吐き出せばGDも必要ありません。そこでImage::Xbmの登場です。xbm形式なのでブラウザによっては標準で画像を表示できるでしょう。あとは何とか別のフォーマットに直すなりそのまま印刷するなりして下さい。印刷したQRコードは、おでこに貼り付けたり、背広の裏地にするなど使い道は色々。夢が膨らみます。
  というわけで、実際の完成物→QR生成CGI。QRcodeモジュールのデータが大きかった(約10M)ので、データ量を減らすため、このサイトでは誤り訂正レベルはLかMだけにしてあります。

 #!/usr/bin/perl
 use strict;
 use CGI;
 use GD::Barcode::QRcode;
 use Image::Xbm;         # Image::Baseが必要
 
 main();
 sub main{
   my $q    = new CGI;
   my $data = $q->param('content');
   my $ecc  = $q->param('ecc')     || 'L';
   my $size = $q->param('size')    || 1;
 
   print $q->header(-type=>'image/x-xbitmap');
 
   my $qr = GD::Barcode::QRcode->new($data,
     {Ecc=>$ecc,Version=>0,ModuleSize=>$size}
   );
   Image::Xbm->set(-setch=>'1',-unsetch=>'0');
   Image::Xbm->new_from_string( $qr->barcode )
             ->save('-');
 }

  GD::Barcode::QRcode(0.01)ソース40行目'$oSelf->{Version} = $rhPrm->{Version} || 1''|| 1'をとらないと、上のサンプルソースは正しく動作しません。

本日のツッコミ(全3件) [ツッコミを入れる]
_ wanted_pro (■2004-08-01 02:28)

QRコードの内容、大変参考になりました。<br>ところで、xbm形式からから、gif形式に画像を変更したいのですが、一番簡単な方法は何になるのでしょうか?

_ まかまか (■2004-08-02 22:32)

一番簡単な方法はImageMagicを使うことでしょうか。もっとも、それが使えるぐらいなら最初からGD::Barcode::QRcodeからgifやpngで吐き出せてしまいますね。<br>xbmに対応した画像ビューワから別画像に保存。あるいはPrintScreenしてペイントブラシに貼り付けとかとか……。<br>う〜ん、それぐらいしか思いつきません。あとは"xbm gif 変換"あたりで検索してみてください。

_ kento (■2005-07-11 01:00)

GD::Barcodeでググってたどり着きました。<br>$rhPrm->{Version} || 1;のところ、僕もハマリました。w<br>_calcVersion()でif (!$oSelf->{Version})となっているので<br>明らかなコーディングミスですよね・・・(汗。

[]