コマンドラインで バーコード画像認識 ZBarImg

必要に迫られ、画像ファイルからのバーコード認識ライブラリを探してました。

アプリケーションがJavaでWEBなので、AndroidでないJavaSE の API がふさわしいかと思い、

Zxing を調べてましたが、日本語情報少なく、StaackOverflowの投稿も、Android + QRコードが主、JavaのImageI/Oの記述がややこしく、Java8でエラー多発、未解決のとらうまもあり、

Zxing : https://github.com/zxing/zxing

ImageMagick のようにコマンド1行で目的達成したいので、さらに調べた結果、

ずばりなの見つけて、早速、組み込みました。

ZBarImg で出来ました。

ZBarImg 本家Home : http://zbar.sourceforge.net/

< 利用例 >

オプションなしで EAN13 が読めました。

< Windows >

c:\ZBar\bin>zbarimg R:\#ZBarImgTest\1.png
EAN-13:2400014821369
scanned 1 barcode symbols from 1 images

c:\ZBar\bin>zbarimg R:\#ZBarImgTest\2.png
EAN-13:4582298330770
scanned 1 barcode symbols from 1 images

c:\ZBar\bin>zbarimg R:\#ZBarImgTest\2.jpg
EAN-13:4582298330770
scanned 1 barcode symbols from 1 images


< Linux >

[root@???? zbarimg]# zbarimg 1.png
EAN-13:2400014821369
scanned 1 barcode symbols from 1 images in 0 seconds

[root@???? zbarimg]# zbarimg 1.png
EAN-13:2400014821369
scanned 1 barcode symbols from 1 images in 0 seconds

[root@???? zbarimg]# zbarimg 2.png
EAN-13:4582298330770
scanned 1 barcode symbols from 1 images in 0 seconds

[root@???? zbarimg]# zbarimg 2.jpg
EAN-13:4582298330770
scanned 1 barcode symbols from 1 images in 0 seconds

< 対象画像 >

Cancvsで切り抜き => Base64にエンコードしてアップロード => サーバーで保存

< コード例 >

JavaScript


        // @@ バーコード認識ボタンを押した時 @@ //
        $("#execbarcd").on("click", function (e) {

          // 切り抜き画像 //
          var canvasData = $("#RecCanvas").get(0).toDataURL("");

          // 不要な情報を取り除く
          canvasData = canvasData.replace(/^data:image\/png;base64,/, "");

          var data = {};
          data.file = canvasData;

          // アップロード //
          $.ajax({
            url: 'BarcodeRecog${LW}',
            type: 'POST',
            data: data,
            dataType: 'text',
            success: function (txt) {
              simpleDialog2($("#alertdialog"), "Result", txt, "Close");
              $("#ocrres").val(txt);
            },
            error(jqXHR, textStatus, errorThrown) {
              simpleDialog2($("#alertdialog"), "ERROR", textStatus, "Close");
            },

          });

        });

Javaサーブレット


    String b64txt = request.getParameter("file");

    StringBuffer buf = new StringBuffer();
    try {

      // 時刻文字列 //
      String nowTMSeqStr
              = DateFormatUtils.format(new Date(), "yyyyMMdd_HHmmssSSS");

      // 画像ファイルを保存 //
      byte[] decode = Base64.getDecoder().decode(b64txt);
      String fnm = fileLocationPath + nowTMSeqStr + ".jpg";
      Path path = Paths.get(fnm);
      Files.write(path, decode);
      
      // zbarimgでバーコード取得 //
      String cmd = "c:\\ZBar\\bin\\zbarimg " + fnm;      
      System.out.println(cmd);
      RuntimeExec RE = new RuntimeExec(cmd, 500);
      RE.exec();
      
      // 別クラスにあるRuntimeexecで実行 //
      String restxt = RE.getRestxt();
      String resjan = restxt.substring(restxt.indexOf(":") + 1);
      buf.append(resjan);

    }
    catch (Exception e) {
      e.printStackTrace();
      buf.append(this.FAIL_MESSAGE);
    }