в моем приложении Cocoa я загружаю файл .jpg с диска, управляю им. Теперь его нужно записать на диск в виде файла .png. Как вы можете это сделать?
Спасибо за вашу помощь!
в моем приложении Cocoa я загружаю файл .jpg с диска, управляю им. Теперь его нужно записать на диск в виде файла .png. Как вы можете это сделать?
Спасибо за вашу помощь!
Создайте CGImageDestination
, передав kUTTypePNG
в качестве типа создаваемого файла. Добавьте изображение, затем завершите назначение.
ImageIO.framework
для ссылки на функции, даже если в документации указано, что это ApplicationServices/ImageIO
.
- person eonil; 02.06.2011
Использование 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 был примерно на 10 % быстрее, чем подход UIImage на моем iPhone 5s. В симуляторе подход 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)
}