Domanda

nella mia applicazione Cocoa, ho caricare un file .jpg dal disco, manipolarla. Ora ha bisogno di essere scritti su disco come file .png. Come si può fare?

Grazie per il vostro aiuto!

È stato utile?

Soluzione

Crea un CGImageDestination, passando kUTTypePNG come il tipo di file da creare. Aggiungere l'immagine, quindi finalizzare la destinazione.

Altri suggerimenti

Utilizzando CGImageDestination e passando kUTTypePNG è l'approccio corretto. Ecco una rapida frammento:

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

È necessario aggiungere ImageIO e CoreServices (o MobileCoreServices su iOS) al progetto e includere le intestazioni.


Se siete su iOS e non hanno bisogno di una soluzione che funziona su Mac troppo, è possibile utilizzare un approccio più semplice:

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

Nel mio test, l'approccio ImageIO era di circa il 10% più veloce rispetto al metodo UIImage sul mio iPhone 5s. Nel simulatore, l'approccio UIImage era più veloce. E 'probabilmente la pena di testare ciascuno per la vostra situazione particolare sul dispositivo se siete veramente interessati con le prestazioni.

Ecco un MacOS-friendly, Swift 3 & 4 esempio:

@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)
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top