PHPでバーコード解析
PHPでバーコードを解析するライブラリがないか確認していたのですが、画像を作成するツールはありますがデコードしてくれるライブラリはありませんでした。
sourceforge.net で調べたところC言語のライブラリで「zebra」がありましたのでこれを試してみたいと思います。
用途的には携帯から特定のアドレスへ写メールすると、そのバーコードの情報を返信してくれるシステムなどに利用できると思います。
蔵書ライブラリに組み込めば、購入済みの本かがわかったり、Amazonの評価などを取り寄せることができますね。
ライブラリのインストール
http://sourceforge.net/projects/zebra/
http://sourceforge.net/projects/zbar/
※名前変わっています
プロジェクトのページより最新版をダウンロードして、解凍します。
環境はcoreserver(XREA)を利用しています。
wget http://downloads.sourceforge.net/zebra/zebra-0.3.tar.bz2
tar xvf zebra-0.3.tar.bz2
cd zebra-0.3
コンパイルをします。今回はユーザー環境にインストールするので prefix をつけます。インストールしなくても利用は可能ですので、その場合には ./configure だけでも大丈夫です。
./configure --prefix=/virtual/user_name/local
make
make check
動作検証をします。zebraimg以下に実行ファイルができますので、ためしに実行してみます。
zebraimg/zebraimg
以下実行結果です。
ERROR: specify image file(s) to scan usage: zebraimg [options] <image>... scan and decode bar codes from one or more image files options: -h, --help display this help text --version display version information and exit -q, --quiet minimal output, only print decoded symbol data -v, --verbose increase debug output level --verbose=N set specific debug output level -d, --display enable display of following images to the screen -D, --nodisplay disable display of following images (default)
画像ファイルで動作検証。
wget http://akira.info/labs/zebra/sample.jpg zebraimg/zebraimg sample.jpg
以下でめでたくJANコードが取得されています。
EAN-13:978477411668 scanned 1 barcode symbols from 1 images in 0.01 seconds
最後にインストール
make install
PHPへの組み込み
ファイルアップ後にコマンドラインで呼び出しています。
-q をつけないとエラー出力として実行時間が出力するので消してあげます。
$jan = exec( "~/local/bin/zebraimg -q $temp_file" );
パリティーコード付与
なぜか最後のパリティーコードが付いていないので、自分で処理します。
複数のバーコード形式に対応する場合には、種類分対応することになります。
$data = split( ":", $jan ); if( isset( $data[0] ) && $data[0] == 'EAN-13' ){ $temp = $data[1]; $jan0 = 0 + substr( $temp, 0, 1 ) + substr( $temp, 2, 1 ) + substr( $temp, 4, 1 ) + substr( $temp, 6, 1 ) + substr( $temp, 8, 1 ) + substr( $temp, 10, 1 ); $jan1 = 0 + substr( $temp, 1, 1 ) + substr( $temp, 3, 1 ) + substr( $temp, 5, 1 ) + substr( $temp, 7, 1 ) + substr( $temp, 9, 1 ) + substr( $temp, 11, 1 ); $jan = ( 10 - ( ( $jan0 + ( $jan1 * 3 ) ) % 10 ) ) % 10; }
検証
この手のライブラリは傾きはおおむね5度まで対応しているようです。
10度だとエラーがでましたが、画像の解像度やサイズで変わってくるとは思います。
○ 5度の傾きは成功
× 10度の傾きは失敗
× 90度は惜しい(たぶん解像度高ければ大丈夫そうです)
△ ISBNなどの2つバーコードが並んでいる場合には、上のみ取得
テスト環境
ここが検証用の環境になります。
検証に利用した画像と、テストでアップできる環境があります。
自分で画像を撮影するか、サンプルの画像をダウンロードしてからアップして試してみてください。