私のCocoaアプリケーションでは、ディスクから.jpgファイルをロードして操作します。次に、.pngファイルとしてディスクに書き込む必要があります。どうやってそれができる?
ご協力いただきありがとうございます!
CGImageDestination
を作成し、作成するファイルのタイプとしてkUTTypePNG
を渡します。画像を追加し、宛先を確定します。
CGImageDestination
を使用してkUTTypePNG
を渡すのが正しいアプローチです。簡単なスニペットは次のとおりです。
@import MobileCoreServices; // or `@import CoreServices;` on Mac
@import ImageIO;
BOOL CGImageWriteToFile(CGImageRef image, NSString *path) {
CFURLRef url = (__bridge CFURLRef)[NSURL fileURLWithPath:path];
CGImageDestinationRef destination = CGImageDestinationCreateWithURL(url, kUTTypePNG, 1, NULL);
if (!destination) {
NSLog(@"Failed to create CGImageDestination for %@", path);
return NO;
}
CGImageDestinationAddImage(destination, image, nil);
if (!CGImageDestinationFinalize(destination)) {
NSLog(@"Failed to write image to %@", path);
CFRelease(destination);
return NO;
}
CFRelease(destination);
return YES;
}
プロジェクトにImageIO
とCoreServices
(またはiOSではMobileCoreServices
)を追加し、ヘッダーを含める必要があります。
IOSを使用していて、Macでも機能するソリューションが必要ない場合は、より簡単なアプローチを使用できます。
// `image` is a CGImageRef
// `path` is a NSString with the path to where you want to save it
[UIImagePNGRepresentation([UIImage imageWithCGImage:image]) writeToFile:path atomically:YES];
私のテストでは、ImageIOアプローチはUIImageアプローチよりも約10%高速でした私のiPhone5sで。シミュレーターでは、UIImageアプローチの方が高速でした。パフォーマンスに本当に関心がある場合は、デバイスの特定の状況についてそれぞれをテストする価値があります。
これがmacOS対応のSwift 3&4の例です:
@discardableResult func writeCGImage(_ image: CGImage, to destinationURL: URL) -> Bool {
guard let destination = CGImageDestinationCreateWithURL(destinationURL as CFURL, kUTTypePNG, 1, nil) else { return false }
CGImageDestinationAddImage(destination, image, nil)
return CGImageDestinationFinalize(destination)
}