「Java で使えるバーコード読み取りライブラリ」を探していました。
開発の関係で「Java から使える」ことが条件でした。また「QRコード」のライブラリは見かけるけど、いわゆる「バーコード」 のは意外と少ない。そしてバーコードを「生成する」のではなく、バーコード画像を「読み取り」たかった、という条件もあります。 加えてライセンスフリーだといいな、と。
これだけの条件で探すとほとんど選択肢はなく、唯一見つけたのが「ZXing(ゼブラクロッシング)」というライブラリでした。 ZXing は単に JavaSE で使えるというだけでなく、Android SDK からも使えます。また QR コードにも対応していたり、読み書き両方に使えたりと汎用性も高そうです。ZXing はソースファイルで提供されているので、そのビルド方法も含めた利用手順を紹介します。なお最新版(3.0)の ZXing をビルドするには JDK 1.7 以上、および Apache Maven が必要です。
RedHat Enterprise Linux や CentOS であれば以下のコマンドで JDK1.7 をインストールできます:
Apache Maven はこんな感じ:
JDK 1.7 と Maven が用意できたら ZXing をビルドすることができます。まず ZXing のダウンロードページから最新のソースファイルをダウンロードして、zip ファイルを展開しておきます。
と、言いたかったのですが、4月25日現在の最新版(3.0.2-SNAPSHOT)はビルドの途中でエラーになってしまい、なんかよく分からなかったので、僕はこちらの 2.3.0 というバージョンを使いました。
展開後、いくつかのフォルダが出来上がりますが、通常の Java(SE) 環境で利用するには core と javase のライブラリが必要です。そのためこの2つのフォルダで JAR ライブラリを Maven でビルドします:
ビルドでできあがった core-X.X.X.jar と javase-X.X.X.jar(X.X.X 部分は ZXing のバージョン)が必要なライブラリになります。これらを Java のプロジェクト内で利用できるように(例えば WEB-INF/lib/ 以下に)コピーして、これで準備完了。
実際にバーコードをデコードするサンプルも記載しておきます。これはローカルシステムの c:/tmp/sample.jpg にバーコード画像がある場合の例ですが、こんな感じ:
さて問題の認識精度ですが、 、、まあ仕方ないのかな、って感じです。画像にバーコードだけが写っている状態であればまだしも、周囲に関係ない部分が含まれていたりすると認識してくれないケースが多いです。
とはいえフリーで使えるデコードライブラリは他に選択肢がないので、贅沢は言えませんよね。
開発の関係で「Java から使える」ことが条件でした。また「QRコード」のライブラリは見かけるけど、いわゆる「バーコード」 のは意外と少ない。そしてバーコードを「生成する」のではなく、バーコード画像を「読み取り」たかった、という条件もあります。 加えてライセンスフリーだといいな、と。
これだけの条件で探すとほとんど選択肢はなく、唯一見つけたのが「ZXing(ゼブラクロッシング)」というライブラリでした。 ZXing は単に JavaSE で使えるというだけでなく、Android SDK からも使えます。また QR コードにも対応していたり、読み書き両方に使えたりと汎用性も高そうです。ZXing はソースファイルで提供されているので、そのビルド方法も含めた利用手順を紹介します。なお最新版(3.0)の ZXing をビルドするには JDK 1.7 以上、および Apache Maven が必要です。
RedHat Enterprise Linux や CentOS であれば以下のコマンドで JDK1.7 をインストールできます:
# yum install java-1.7.0-openjdk-devel
Apache Maven はこんな感じ:
# cd /etc/yum.repos.d
# wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo # yum install apache-maven
JDK 1.7 と Maven が用意できたら ZXing をビルドすることができます。まず ZXing のダウンロードページから最新のソースファイルをダウンロードして、zip ファイルを展開しておきます。
と、言いたかったのですが、4月25日現在の最新版(3.0.2-SNAPSHOT)はビルドの途中でエラーになってしまい、なんかよく分からなかったので、僕はこちらの 2.3.0 というバージョンを使いました。
展開後、いくつかのフォルダが出来上がりますが、通常の Java(SE) 環境で利用するには core と javase のライブラリが必要です。そのためこの2つのフォルダで JAR ライブラリを Maven でビルドします:
# cd core # mvn -DskipTests -Dgpg.skip=true install
→ ./target/ に JAR ファイルができている # cd ../javase # mvn -DskipTests -Dgpg.skip=true install
→ ./target/ に JAR ファイルができている
ビルドでできあがった core-X.X.X.jar と javase-X.X.X.jar(X.X.X 部分は ZXing のバージョン)が必要なライブラリになります。これらを Java のプロジェクト内で利用できるように(例えば WEB-INF/lib/ 以下に)コピーして、これで準備完了。
実際にバーコードをデコードするサンプルも記載しておきます。これはローカルシステムの c:/tmp/sample.jpg にバーコード画像がある場合の例ですが、こんな感じ:
String filename = "c:/tmp/sample.jpg"; : try{ //. 画像読み込み BufferedImage image = ImageIO.read( new File( filename ) ); LuminanceSource source = new BufferedImageLuminanceSource( image ); BinaryBitmap bitmap = new BinaryBitmap( new HybridBinarizer( source ) ); //. デコード Reader reader = new MultiFormatReader(); Result result = reader.decode( bitmap ); //. バーコードフォーマット BarcodeFormat format = result.getBarcodeFormat(); //. バーコードコンテンツ(読み取り結果) String text = result.getText(); : }catch( Exception e ){ e.printStackTrace(); } :
さて問題の認識精度ですが、 、、まあ仕方ないのかな、って感じです。画像にバーコードだけが写っている状態であればまだしも、周囲に関係ない部分が含まれていたりすると認識してくれないケースが多いです。
とはいえフリーで使えるデコードライブラリは他に選択肢がないので、贅沢は言えませんよね。