cocoa-touch ios5 uiimage core-graphics core-image

cocoa touch - Cómo convertir UIImage a CIImage y viceversa



cocoa-touch ios5 (8)

Al convertir el UIImage al CIImage, tuve 2 casos separados en los que a veces es nulo y otras no. Debajo del código lo resolvió:

CIImage *ciImage; ciImage=[[CIImage alloc] initWithImage:imageToConvert]; if (ciImage==nil) ciImage=imageToConvert.CIImage;

Estoy tratando de obtener CIImage de ImageView que se muestran en la pantalla.

UIImage *image = myImageView.image;

convertir imagen UIImage a CIImage .

CIImage *cImage = [....];

¿Como hacer esto?


Aquí hay un ejemplo de código completo que he usado en mis proyectos.

- (UIImage *)makeUIImageFromCIImage:(CIImage *)ciImage { CIContext *context = [CIContext contextWithOptions:nil]; CGImageRef cgImage = [context createCGImage:ciImage fromRect:[ciImage extent]]; UIImage* uiImage = [UIImage imageWithCGImage:cgImage]; CGImageRelease(cgImage); return uiImage; }

CIImage es básicamente una receta para una imagen. Te encontrarás con problemas si tratas de convertir directamente de CIImage a UIImage . Por ejemplo, llamar

NSData * UIImageJPEGRepresentation ( UIImage *image, CGFloat compressionQuality );

devolverá nil .


Esta es la forma más compatible de hacerlo:

UIImage* u =[UIImage imageNamed:@"image.png"]; CIImage* ciimage = [[CIImage alloc] initWithCGImage:u.CGImage];

ahora usa ciimage ...


Si bien la respuesta de Changxing Wang es efectivamente correcta, Apple dice que UIImage.CIImage no siempre funcionará. Específicamente, desde PocketCoreImage:

// Create a CIImage from the _inputImage. While UIImage has a property returning // a CIImage representation of it, there are cases where it will not work. This is the // most compatible route. _filteredImage = [[CIImage alloc] initWithCGImage:_inputImage.CGImage options:nil];

Apple también usa lo siguiente, que NO funciona para mí:

[UIImage imageWithCIImage:_filteredImage]

Mi implementación personal, adaptada de esta publicación , funciona para mí:

// result is a CIImage, output of my filtering. // returnImage is (obviously) a UIImage that I''m going to return. CIContext *context = [CIContext contextWithOptions:nil]; UIImage *returnImage = [UIImage imageWithCGImage:[context createCGImage:result fromRect:result.extent]];



Swift ejemplo de la de :

guard let ciimage = CIImage(image: uiimage) else { return } let image = UIImage(CIImage: ciimage)


CIImage *ciImage = [UIImage imageNamed:@"test.png"].CIImage; UIImage *uiImage = [[UIImage alloc] initWithCIImage:ciImage];

Para arreglar el caso donde myUIImage.CIImage devuelve nada como [UIImageView image] , en su lugar puede hacer [CIImage imageWithCGImage:myUIImage.CGImage] - Dylan Hand


func toCIImage(image: UIImage) -> CIImage { return image.CIImage ?? CIImage(CGImage: image.CGImage!) } func toUIImage(image: CIImage) -> UIImage { return UIImage(CIImage: image) }