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つバーコードが並んでいる場合には、上のみ取得

テスト環境

http://akira.info/labs/zebra/

ここが検証用の環境になります。
検証に利用した画像と、テストでアップできる環境があります。
自分で画像を撮影するか、サンプルの画像をダウンロードしてからアップして試してみてください。