Сохранение CGImageRef в файл png?

в моем приложении Cocoa я загружаю файл .jpg с диска, управляю им. Теперь его нужно записать на диск в виде файла .png. Как вы можете это сделать?

Спасибо за вашу помощь!


person Community    schedule 24.08.2009    source источник


Ответы (3)


Создайте CGImageDestination, передав kUTTypePNG в качестве типа создаваемого файла. Добавьте изображение, затем завершите назначение.

person Peter Hosey    schedule 24.08.2009
comment
ivanceras: developer.apple.com/mac/library/documentation/GraphicsImaging / Если вы хотите получить более конкретный ответ, вы должны задать более конкретный вопрос (и вы должны сделать это как отдельный вопрос). - person Peter Hosey; 30.07.2010
comment
Просто заметка. Мы должны добавить ImageIO.framework для ссылки на функции, даже если в документации указано, что это ApplicationServices/ImageIO. - person eonil; 02.06.2011
comment
@Eonil: это зависит от того, для какой платформы вы создаете. Cocoa Touch не имеет зонтичных фреймворков, поэтому при сборке для iOS вам необходимо напрямую связываться с ImageIO. При сборке для Mac OS X вы связываетесь с ApplicationServices и получаете все внутри него. - person Peter Hosey; 02.06.2011
comment
Смотрите мой ответ для примера этого. - person Sam Soffes; 06.10.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 был быстрее. Вероятно, стоит протестировать каждый для вашей конкретной ситуации на устройстве, если вас действительно беспокоит производительность.

person Sam Soffes    schedule 05.10.2011

Вот удобный для 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)
}
person Dan Messing    schedule 02.11.2016