2009-08-24 16 views

Odpowiedz

13

Utwórz CGImageDestination, przekazując kUTTypePNG jako typ pliku do utworzenia. Dodaj obraz, a następnie sfinalizuj miejsce docelowe.

+0

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). –

+0

Tylko notatkę. Musimy dodać 'ImageIO.framework', aby odwołać się do funkcji, nawet jeśli dokumentacja mówi, że jest w' ApplicationServices/ImageIO'. – Eonil

+1

@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. –

89

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.

+0

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. –

+0

Zaktualizowałem moją odpowiedź z informacjami o wydajności :) –

16

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) 
}