Adobe Illustrator書類上にある、QRコードのオブジェクトをクリップボード経由でNSImageに変換してQRコード認識するAppleScriptです。QRコード認識には、オープンソースのZXingObjCをCocoa Framework化したものを使っています。
–> Download recogClipAsQR.scptd (Including Framework)
ことのはじまりは、Adobe Illustrator書類上になにがしかのプラグインで作成されたとおぼしきQRコードのオブジェクトが配置されていたことです。これをデコードして内容が正しいか、デコードしたURLは実在するものかといったチェックをする必要がありました(もっと大きなプログラムの一部として)。
これはけっこうな難問でした。AI書類全体をPDFや他の形式の画像として書き出したものを認識させてみたものの、なかなかQRコードとして認識してくれません。
いろいろ試行錯誤していくうちに、AI書類を構成する各部品ごとに画像書き出しして認識させると、QRコードとして認識したりしました。
結局、AI書類上の各種オブジェクト(QRコードはグループ化されていたので、group item)にアクセスし、クリップボード経由で(いったんコピーして)画像に書き出すと認識してくれました。
ファイルに書き出すオーバーヘッドを減らしたかったので、クリップボードの内容をそのままNSImageとして取得。ここで、AppleScriptの標準搭載命令(the clipboard)からCocoaのNSPasteBoardを使うように変更したことで、大幅なスピードアップを図れました。クリップボード経由でデータ変換するやりかたは、データが小さければ手軽かつ便利でいいのですが、データが大きくなると処理に時間がかかってたいへんです。主にClassic Mac OSの時代によく使われていた方法でもあります(macOS上でもごくたまに使いますが、こういうやり方をなくそうというのがClassic Mac OSからMac OS Xへの移行時のScripter間の共通認識だったので、なるべく避けていたんですね)。
かくして、Adobe Illustrator上でコピーしておいたQRコードのオブジェクトを、クリップボード(ペーストボード)経由でQRコードとしてデコードするものができ、便利に使っています。
本Scriptは、
macOS 10.12.x:スクリプトエディタ、Script Debugger
macOS 10.13.x:スクリプトエディタ、Script Debugger
macOS 10.14.x:Script Debugger、マシンのSIPを解除してあればスクリプトエディタ上でも動作
という環境で動作します。macOS 10.14.x上でSIPを解除していない状態でも、アプレット書き出しした状態であればバンドル内のFrameworkを読み込んで動作します。
AppleScript名:recogClipAsQR.scptd |
— Created 2019-07-20 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 property NSImage : a reference to current application’s NSImage property NSPasteboard : a reference to current application’s NSPasteboard property ZXDecodeHints : a reference to current application’s ZXDecodeHints property ZXBinaryBitmap : a reference to current application’s ZXBinaryBitmap property ZXHybridBinarizer : a reference to current application’s ZXHybridBinarizer property ZXMultiFormatReader : a reference to current application’s ZXMultiFormatReader property ZXCGImageLuminanceSource : a reference to current application’s ZXCGImageLuminanceSource set qrRes to recogClipboardASQR() of me –> {"http://xxxxxxxxxxxxxxxxxxx", 11} –クリップボードの内容をNSImageに on recogClipboardASQR() set aNSIMage to my getClipboardASImage() if aNSIMage = false then return false set aRes to recogNSIMageAsBarcodes(aNSIMage, 11) of me –11: kBarcodeFormatQRCode return aRes end recogClipboardASQR –NSImageをQRコードとして認識する on recogNSIMageAsBarcodes(aNSIMage, aHintType) set aSource to ZXCGImageLuminanceSource’s alloc()’s initWithNSImage:(aNSIMage) set aBitmap to ZXBinaryBitmap’s binaryBitmapWithBinarizer:(ZXHybridBinarizer’s binarizerWithSource:(aSource)) –https://github.com/zxingify/zxingify-objc/blob/master/ZXingObjC/core/ZXBarcodeFormat.h set aHints to ZXDecodeHints’s hints() aHints’s addPossibleFormat:(aHintType) set aReader to 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} end recogNSIMageAsBarcodes — クリップボードの内容をNSImageとして取り出して返す on getClipboardASImage() set theNSPasteboard to NSPasteboard’s generalPasteboard() set anArray to theNSPasteboard’s readObjectsForClasses:({NSImage}) options:(missing value) if anArray = missing value or (anArray as list) = {} then return false set aRes to anArray’s objectAtIndex:0 return aRes end getClipboardASImage |
クリップボードに入れたIllustratorのオブジェクトをQRコード認識 v2 – AppleScriptの穴 says:
[…] 昨日のScriptで、「そういえばなんでZXingObjCを使っているんだっけ?」と疑問を抱きました。理由ははっきりしています。CIDetectorではそのまま認識させてみたら認識しなかったためです。 […]