Frage

in meiner Cocoa-Anwendung, ich von der Festplatte eine JPG-Datei laden, manipulieren sie. Jetzt braucht es auf der Festplatte als .png-Datei geschrieben werden. Wie können Sie das tun?

Vielen Dank für Ihre Hilfe!

War es hilfreich?

Lösung

Erstellen Sie eine CGImageDestination, kUTTypePNG als Dateityp vorbei zu erstellen. Fügen Sie das Bild, dann beenden Sie das Ziel.

Andere Tipps

CGImageDestination Verwendung und kUTTypePNG vorbei ist der richtige Ansatz. Hier ein kurzer Auszug:

@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;
}

Sie müssen ImageIO und CoreServices (oder MobileCoreServices auf iOS) zu Ihrem Projekt und schließen die Header hinzuzufügen.


Wenn Sie auf iOS und brauchen nicht eine Lösung, die funktioniert auf Mac zu, können Sie einen einfacheren Ansatz verwenden:

// `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];

In meinen Tests war der ImageIO Ansatz etwa 10% schneller als der UIImage Ansatz auf meinem iPhone 5s. Im Simulator war der UIImage Ansatz schneller. Es ist wahrscheinlich wert jeder für Ihre spezielle Situation auf dem Gerät zu testen, ob Sie wirklich mit Leistung betroffen sind.

Hier ist ein macOS freundlich, Swift 3 & 4 Beispiel:

@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)
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top