クリップボードに入れたバーコード画像をNSImageに変換して1Dバーコード認識して内容をデコードするAppleScriptです。
–> Download ZXingObjC.framework(To ~/Library/Frameworks)
1Dバーコード認識には定番の「ZXingObjC」を利用しているのですが、同プログラムは派生プロジェクトが多く、いまひとつどれを使っているのか、自分自身も正確に把握していなかったりします。
カメラからの入力映像から1次元バーコード認識を行うプログラムは多いのですが、画像から認識するプログラムはそれほどみかけません。さらに、それに輪をかけて、入力画像形式がNSImageではなくCGImageである場合が多く、ZXingでも入力はCGImage。
AppleScriptから生成できないCGImage。NSImageから直接の変換メソッドをAppleScript上で利用できないCGImage。
そこで、SFPSDWriterのコメントに書いてあったコードを参考に、NSImageで入力した画像をCGImageに変換して処理するメソッドをObjective-Cで追加して、AppleScriptから呼び出しやすく書き換えて呼び出してみました(オリジナルに「initWithNSImage:」というメソッドは実装されていません)。
実際には、Adobe IllustratorやAdobe InDesignにリンクされたバーコード画像素材をチェックするような用途を想定しています(実際、やっているので)。QRコード画像をデコードするScriptは用意していたものの、1D Bar Code画像をデコードするものを用意していなかったので、再調査。JANはEANとほとんど同じなので大丈夫でしたが、その他の日本マイナーなバーコード規格(郵便コードとか)については未調査のためわかりません。
ちなみに、本FrameworkはQRコードをサポートしているため、JANコード(1Dバーコード)とQRコード(2Dバーコード)の両方を同一Scriptでデコードできました。Illustratorオブジェクトで作られたバーコードを適宜クリップボードを経由してPDF化したものをデコードしてみたのですが、1Dバーコードと2Dバーコードのチェックに別々のルーチンを用意しないとダメだろうと覚悟していたところに、両方とも同じメソッド呼び出しでデコードできてしまい拍子抜け。
macOS 10.14上ではScript Debuggerで実行するか、AppleScriptをバンドル形式で保存してバンドル内にFrameworkを入れアプレット書き出しするとか、SIPによるプロテクションを解除するなどの方法で呼び出せます(Script Debuggerを使うのが一番いいでしょう)。
AppleScript名:クリップボードに入れられた画像をNSImageに変換して1Dバーコード認識.scptd |
— Created 2015-09-20 by Takaaki Naganoya — Modified 2019-04-27 by Takaaki Naganoya — 2019 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" use framework "ZXingObjC" –https://github.com/TheLevelUp/ZXingObjC –クリップボードの内容をNSImageに set aNSIMage to my getClipboardASImage() –NSImageをバーコードとして認識する set aSource to current application’s ZXCGImageLuminanceSource’s alloc()’s initWithNSImage:aNSIMage set aBitmap to current application’s ZXBinaryBitmap’s binaryBitmapWithBinarizer:(current application’s ZXHybridBinarizer’s binarizerWithSource:aSource) set aHints to current application’s ZXDecodeHints’s hints() set aReader to current application’s ZXMultiFormatReader’s reader() set aResult to aReader’s decode:(aBitmap) hints:(aHints) |error|:(missing value) if aResult is equal to missing value then return false set aCon to (aResult’s |text|()) as string set aFormat to aResult’s barcodeFormat() return {aCon, aFormat} — クリップボードの内容をNSImageとして取り出して返す on getClipboardASImage() set theNSPasteboard to current application’s NSPasteboard’s generalPasteboard() set theAttributedStringNSArray to theNSPasteboard’s readObjectsForClasses:({current application’s NSImage}) options:(missing value) set theNSAttributedString to theAttributedStringNSArray’s objectAtIndex:0 return theNSAttributedString end getClipboardASImage |