в моем приложении 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)