web-dev-qa-db-ja.com

CGImageRefをpngファイルに保存しますか?

私のCocoaアプリケーションでは、ディスクから.jpgファイルをロードして操作します。次に、.pngファイルとしてディスクに書き込む必要があります。どうやってそれができる?

ご協力いただきありがとうございます!

29
Stefan

CGImageDestinationを作成し、作成するファイルのタイプとしてkUTTypePNGを渡します。画像を追加し、宛先を確定します。

19
Peter Hosey

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;
}

プロジェクトにImageIOCoreServices(または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アプローチの方が高速でした。パフォーマンスに本当に関心がある場合は、デバイスの特定の状況についてそれぞれをテストする価値があります。

96
Sam Soffes

これが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)
}
19
Dan Messing