ZBar bar code readerを使って画像からバーコードを読み取ってPHPで表示してみるまで

「JPEGやGIF画像内のバーコードを読み取ってISBN情報を取得したい!」衝動にかられたので試してみました。

まずは画像からバーコードを取得する方法を探していると下記の物がヒットしました。

ZBar bar code reader

最近までZebra Barcode Readerという名称で愛されて来た様ですが名称が変わった様です。

バーコードスキャンの方法としてはかなり有名らしい。

まずは、上記のサイトにある「Download Now!」をクリックしてダウンロードします。

2009120101

ダウンロードしたファイルを解凍します。

今ダウンロードしたのはZBarを動作させる為のプログラムソースファイルです。

これをゴニュゴニュして使える状態(Windowsで言う所のexeファイルを作成?)にします。

2009120102

ソースファイルから作るのは初めてなのでもの凄くハマりました。

実際にはもっとスマートな方法があると思うのですが、初めてと言う事で大目に見てやってください。

言い訳はこのくらいにして、まずは「アプリケーション>ユーティリティ>ターミナル」を起動します。

実は、ZbarはImageMagickという他のライブラリが必要?なのでこれをインストールします。

ターミナルからMacPort経由でImageMagickをインストールします。

MacPortのインストールはここらへんを参考にしてセットアップしてください。

まずは、ImageMagickを下記のコマンドで検索します。

port search ImageMagick

検索結果からImageMagickを探します。2009/11/27現在のバージョンは@6.5.7-0となっているのでこれをインストールします。

パスワードを入力するとインストールが始まるので少し待ちます。

sudo port install ImageMagick @6.5.7-0

次に先ほど解凍したzbarフォルダに下記のコマンドで移動します。

cd ~/Downloads/zbar-0.10

Zbarのインストールに必要なMakeFileを作ります。なんでもコンパイルやインストールをするにはmakeというコマンドを使用する様ですが、その為に依存関係やルールなどが記述されたMakeFileが必要です。で、そのMakeFileを作る前に正常にコンパイルできるかチェックする為のコマンド「configure」を実行しないといけないらしい。。。

今回は下記のコマンドでconfigureを実行しました。ZbarはWebCamなどからバーコードを読み込む事も出来る様ですが、今回は静的画像からのみに限定して、各種必要の無い物?をcofigureのオプション設定で外しています。

全部インストールしても良いのですが、色々と足りない(依存関係にあるライブラリ?)と怒られるのでそれらを全部外しました。大丈夫か???

configureがウマくできない場合にはerrorなどのメッセージが表示されるのでそれらを確認しつつオプションを変更するか足りないものを先にインストールする事になります。

./configure --with-x=no --without-gtk --without-qt --disable-video --without-python --without-xshm --without-xv

そして、ソースファイルをコンパイルする為にmakeコマンドを実行します。

コンパイルが終わるまでしばらく待ちます。

make

次にインストールする為にmake installのコマンドを実行します。

管理者権限で実行するとパスワード入力を求められるので、入力してインストールを開始します。

sudo make install

これでターミナルからZbarが使用できるようになったはずです。

Zbarのzbarimgというコマンドで画像からバーコードを読み込んでみます。

Googleの画像検索などで、「ISBN」などで検索して適当なバーコード画像をローカルにダウンロードします。

ターミナルから「zbarimg バーコード画像」という風にコマンドを入力して実行します。

zbarimg ISBN.gif

コマンドの実行結果としてターミナルにバーコードの数字が表示されたらZbar bar code readerのインストールは成功です。

EAN-13:9780747595823

次にPHPに読み込んだバーコードを表示します。

PHPのソースファイルは下記の用に記述しました。

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
  <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
</head>
<body>
  <?php
    echo “ISBNコードを出力する”;
    $jan = null;
    $command = “/usr/local/bin/zbarimg -q ISBN.gif”;
    exec($command, $jan);
    echo “<p>”.$jan[0].”</p>\n”;
  ?>
</body>

読み込む画像はPHPファイルと同一の階層に配置しました。

zbarimgをコマンドから使うときはフルパスではなくても実行できましたが、PHPから実行するときにはフルパスで指定しないと動作しませんでした。きっとPHPから実行する時にはターミナルとは異なるユーザーから。。。また調べておきます。

また、初めてexecなるPHPのコマンドを使用しましたが、実際に使う場面を想定すると画像ファイル名は動的に生成する事となります。その場合にファイル名を「escapeshellcmd」でエスケープ処理をしないとコマンドが乗っ取られるらしい。気をつけよう。

という事でかなりはまりましたが、少しだけ成長できたのでした。

特に今回は下記のサイトを参考にさせていただきました。感謝感謝。勿論、Zbar bar code readerというライブラリを提供してくれている開発者にも感謝しつつ終わりにしたいと思います。

参考サイト

PHPでバーコード解析