Salvando CGImageRef em um arquivo png?

no meu aplicativo Cocoa, eu carrego um arquivo .jpg do disco, manipulo-o. Agora ele precisa ser gravado no disco como um arquivo .png. Como você pode fazer isso?

Obrigado pela ajuda!

Crie um CGImageDestination , passando kUTTypePNG como o tipo de arquivo a ser criado. Adicione a imagem e finalize o destino.

Usando CGImageDestination e passando kUTTypePNG é a abordagem correta. Aqui está um trecho rápido:

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

Você precisará adicionar ImageIO e CoreServices (ou MobileCoreServices no iOS) ao seu projeto e include os headers.


Se você está no iOS e não precisa de uma solução que funcione no Mac também, você pode usar uma abordagem mais simples:

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

Nos meus testes, a abordagem ImageIO foi cerca de 10% mais rápida do que a abordagem UIImage no meu iPhone 5s. No simulador, a abordagem UIImage foi mais rápida. Provavelmente vale a pena testar cada um para sua situação específica no dispositivo, se você estiver realmente preocupado com o desempenho.

Aqui está um exemplo do 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) } 
    Intereting Posts