в моем приложении 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 был примерно на 10% быстрее, чем подход UIImage на моем iPhone 5. В симуляторе подход 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)
}
Предполагая, что вы используете macOS и ваш CGImageRef
- myCGImageRef
ниже:
let desktopPath = (NSSearchPathForDirectoriesInDomains(.desktopDirectory, .userDomainMask, true) as [String]).first!
let destinationURL = NSURL(fileURLWithPath: desktopPath).appendingPathComponent("output.png")!
guard let destination = CGImageDestinationCreateWithURL(destinationURL as CFURL, kUTTypePNG, 1, nil) else {
throw HoleFillingError.CoreGraphicsError
}
CGImageDestinationAddImage(destination, myCGImageRef, nil)
CGImageDestinationFinalize(destination)