Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

Использование 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 был быстрее. Вероятно, стоит проверить каждую конкретную ситуацию на устройстве, если вы действительно заинтересованы в производительности.

Ответ 3

Вот пример, удобный для 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)
}

Ответ 4

Предполагая, что вы используете 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)