将CGImageRef保存到png文件?

时间:2009-08-24 07:52:34

标签: cocoa png core-graphics cgimage

在我的Cocoa应用程序中,我从磁盘加载一个.jpg文件,对其进行操作。现在需要将其作为.png文件写入磁盘。你怎么能这样做?

感谢您的帮助!

3 个答案:

答案 0 :(得分:96)

使用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];

在我的测试中,我的iPhone 5s上的ImageIO方法比UIImage方法快10%左右。在模拟器中,UIImage方法更快。如果您真的关心性能,那么可能值得在设备上测试每种情况。

答案 1 :(得分:19)

这是一款适合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)
}

答案 2 :(得分:18)

创建CGImageDestination,传递kUTTypePNG作为要创建的文件类型。添加图像,然后完成目标。