w mojej aplikacji Cocoa, ładuję plik .jpg z dysku, manipuluję nim. Teraz musi zostać zapisany na dysku jako plik .png. Jak możesz to robić?Zapisywanie pliku CGImageRef w pliku PNG?
Dzięki za pomoc!
w mojej aplikacji Cocoa, ładuję plik .jpg z dysku, manipuluję nim. Teraz musi zostać zapisany na dysku jako plik .png. Jak możesz to robić?Zapisywanie pliku CGImageRef w pliku PNG?
Dzięki za pomoc!
Utwórz CGImageDestination
, przekazując kUTTypePNG
jako typ pliku do utworzenia. Dodaj obraz, a następnie sfinalizuj miejsce docelowe.
Używanie CGImageDestination
i przekazywanie kUTTypePNG
jest prawidłowym podejściem. Oto krótki fragment:
@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;
}
Musisz dodać ImageIO
i CoreServices
(lub MobileCoreServices
na iOS) do projektu i obejmują nagłówki.
Jeśli jesteś na iOS i nie potrzebne jest rozwiązanie, które działa na Mac zbyt, można użyć prostszej podejście:
// `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];
W moich testach, podejście ImageIO miał 10% szybsze niż podejście UIImage na moim iPhone 5s. W symulatorze podejście UIImage było szybsze. Prawdopodobnie warto przetestować każdą dla konkretnej sytuacji na urządzeniu, jeśli naprawdę zależy Ci na wydajności.
Czy masz jakieś informacje na temat tego, który z nich jest bardziej wydajny - zarówno pod względem czasu, jak i pamięci? Dziękuję Ci. –
Zaktualizowałem moją odpowiedź z informacjami o wydajności :) –
Oto MacOS z dziećmi, Swift 3 & 4 Przykład:
@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)
}
ivanceras: http://developer.apple.com/mac/library/documentation/GraphicsImaging/Reference/CGImageDestination/ Jeśli chcesz bardziej szczegółową odpowiedź, powinieneś zadać bardziej szczegółowe pytanie (i powinieneś to zrobić jako osobne pytanie). –
Tylko notatkę. Musimy dodać 'ImageIO.framework', aby odwołać się do funkcji, nawet jeśli dokumentacja mówi, że jest w' ApplicationServices/ImageIO'. – Eonil
@Eonil: To zależy od platformy, na której budujesz. Cocoa Touch nie ma ram parasola, więc budując na iOS, musisz bezpośrednio połączyć się z ImageIO. Podczas budowania dla Mac OS X łączysz się z ApplicationServices i dostajesz wszystko, co zawiera. –