必要に迫られ、画像ファイルからのバーコード認識ライブラリを探してました。
アプリケーションが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);
}
|