前回書いた検索で簡単に見つかる画像変換ですが。
Objective-c での公式は以下に。
Viewing, Editing, and Saving Images in an Image View
PyObjC でしたら以下がありますね。
ただし Python2 コードですし kUTTypeJPEG はとうの昔に非推奨です。
Python3 にて UniformTypeIdentifiers.UTTypeJPEG を使うよう書き換え。
System-declared uniform type identifiers | Apple Developer Documentation
したんだけど何度やってもエラー、原因が解らず困っていた。
本日原因が判明した、こんな理由だったとは。
#!/usr/bin/env python3 import UniformTypeIdentifiers, LaunchServices print(type(LaunchServices.kUTTypeJPEG)) print(type(UniformTypeIdentifiers.UTTypeJPEG)) ''' output <class 'objc.pyobjc_unicode'> <objective-c class _UTCoreType at 0x1e3f02bd0> '''
まさかの。
PyObjC の kUTTypeJPEG は単なる文字列だった。
UTTypeJPEG は普通にポインタ、そりゃエラーになるよと。
ということで PyObjC ではこんなコードになります。
破棄は Python にまかせないと二重破棄でエラー。
#!/usr/bin/env python3 from AppKit import * from Quartz import * from UniformTypeIdentifiers import * src = NSURL.fileURLWithPath_('panaleica.heic') dest = NSURL.fileURLWithPath_('panaleica.jpg') isr = CGImageSourceCreateWithURL(src, None) image = CGImageSourceCreateImageAtIndex(isr, 0, None) destimg = CGImageDestinationCreateWithURL(dest, str(UTTypeJPEG), 1, None) if destimg: CGImageDestinationAddImage(destimg, image, None) res = CGImageDestinationFinalize(destimg) print(res) #CFRelease(destimg) # Error else: print('error')
HEIF や WebP からでも JPEG に変換できる。
ただし iPhone 写真等の回転情報は継承されず横向きになるので注意。
いやオートメーションで使うなら AppleScript か JXA にしないと。
こちらでは UniformTypeIdentifiers が使えないので直接文字列で。
#!/usr/bin/osascript ObjC.import('Cocoa'); ObjC.import('Quartz'); //ObjC.import('UniformTypeIdentifiers'); let src = $.NSURL.fileURLWithPath('gara.webp'); let dest = $.NSURL.fileURLWithPath('gara.heic'); let isr = $.CGImageSourceCreateWithURL(src, null); let image = $.CGImageSourceCreateImageAtIndex(isr, 0, null); //let destimg = $.CGImageDestinationCreateWithURL(dest, $('public.jpeg'), 1, null); // jpeg //let destimg = $.CGImageDestinationCreateWithURL(dest, $('public.png'), 1, null); // png let destimg = $.CGImageDestinationCreateWithURL(dest, $('public.heic'), 1, null); if (destimg) { $.CGImageDestinationAddImage(destimg, image, null); let res = $.CGImageDestinationFinalize(destimg); console.log(res); } else { console.log('error'); }
後は同じですね。
PyObjC を先にやらなかったら文字列ということに気が付かなかったかも。
HEIF にもコレで変換可能でした。
#!/usr/bin/osascript // webp is bad ObjC.import('Cocoa'); ObjC.import('Quartz'); let src = $.NSURL.fileURLWithPath('panaleica.heic'); let dest = $.NSURL.fileURLWithPath('panaleica.webp'); let isr = $.CGImageSourceCreateWithURL(src, null); let image = $.CGImageSourceCreateImageAtIndex(isr, 0, null); let destimg = $.CGImageDestinationCreateWithURL(dest, $('org.webmproject.webp'), 1, null); if (destimg) { $.CGImageDestinationAddImage(destimg, image, null); let res = $.CGImageDestinationFinalize(destimg); console.log(res); // false } else { console.log('error'); }
ただ WebP から変換はできるけど WebP へはどちらでも変換できなかった。
多分 Objective-c や Swift でも、public.*** しか駄目なのだろうか?
一番やりたいことなのに、もう少し調べます。
ところで、こんなことをやって今頃知ったんですけど。
UTTypeCreatePreferredIdentifierForTag が廃止になっています。
UTTypeCreatePreferredIdentifierForTag | Apple Developer Documentation
筆者が書いた UTI を調べるコマンドが使えなくなっていて焦った。
というか UTI を調べるコードを書いているブログは全滅だ、わーい!
上記で使おうとして動かなかった、新しい方法を探さなくちゃ。