在我的Cocoa应用程序,我从磁盘加载.jpg文件,对其进行操作。 现在,它需要被写入到磁盘作为.png文件。 你怎么能这样做呢?
谢谢你的帮助!
在我的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
(或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的方法是更快。 如果你真的关心性能这可能是值得的设备上测试每个特定的情形。
这里是一个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)
}