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 3/4
UIImage> CIImage
let ciimage = CIImage(image: image)
https://developer.apple.com/documentation/uikit/uiimage/1624090-init
CIImage> UIImage
let image = UIImage(ciImage: ciimage)
https://developer.apple.com/documentation/coreimage/ciimage/1624119-init
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)
}