保存CGImageRef为PNG文件?(Saving CGImageRef to a png fil

2019-06-18 19:24发布

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

谢谢你的帮助!

Answer 1:

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



Answer 2:

使用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 (或MobileCoreServices iOS上)到您的项目,包括头。


如果你在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的做法是不是在我的iPhone 5S 的UIImage的方法快10%左右 。 在模拟器中,UIImage的方法是更快。 如果你真的关心性能这可能是值得的设备上测试每个特定的情形。



Answer 3:

这里是一个MACOS友好,夫特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)
}


文章来源: Saving CGImageRef to a png file?