今回は JXA にて画像のリサイズと保存。
(旧) Cocoaの日々: キャプチャ画像を縮小して保存する
Cocoa は他の OS のグラフィック(デバイス)コンテキストと違っていて
現在フォーカスがあるグラフィックコンテキストに描写する、という手法。
つまり NSImage に NSImage をリサイズして描写するってことみたい。
NSDictionary を作るのが面倒だなぁ。
変換で楽したいし NSImageCompressionFactor は調べると NSString だし。
ってことで。
ObjC.import("Cocoa"); console.log($.NSImageCompressionFactor.js); //=> NSImageCompressionFactor
まんまカヨ!
クオリティは 1.0 が最高値みたい
筆者はいつものように GIMP に合わせて 0.85 にしてみる。
ということでこんなコードになりました。
#!/usr/bin/osascript ObjC.import("Cocoa"); function run(argv) { let srcImage = $.NSImage.alloc.initWithContentsOfFile(argv[0]); // Create 300x200 Image let newImage = $.NSImage.alloc.initWithSize($.NSMakeSize(300, 200)); newImage.lockFocus; $.NSGraphicsContext.saveGraphicsState; $.NSGraphicsContext.currentContext.setImageInterpolation($.NSImageInterpolationHigh); srcImage.drawInRectFromRectOperationFraction( $.NSMakeRect(0, 0, 300, 200), $.NSZeroRect, $.NSCompositeSourceOver, 1.0); $.NSGraphicsContext.restoreGraphicsState; newImage.unlockFocus; // JPEG Write; let bmp = $.NSBitmapImageRep.imageRepWithData(newImage.TIFFRepresentation); bmp.alpha = false; let prop = $({"NSImageCompressionFactor": 0.85}); let data = bmp.representationUsingTypeProperties($.NSJPEGFileType, prop); data.writeToFileAtomically($(`${argv[0]}_300x200.jpg`), true); }
prop の値を変更すると画像のサイズと画質が変わるのが確認できた。
これでサムネイル選択の作成に取りかかれる、最大の難関みたいな気がするけど。