2012-02-01 27 views
10

Estoy usando algunos filtros CoreImage para procesar una imagen. Aplicar el filtro a mi imagen de entrada da como resultado una imagen de salida llamada filterOutputImage de tipo CIImage.Creando UIImage desde CIImage

Ahora quiero mostrar esa imagen, e intentaron hacer:

self.modifiedPhoto = [UIImage imageWithCIImage:filterOutputImage]; 
self.photoImageView.image = self.modifiedPhoto; 

La vista sin embargo está en blanco - se visualiza nada.

Si agrego instrucciones de registro que imprimen detalles sobre filterOutputImage y self.modifiedPhoto, esas instrucciones de registro me muestran que ambos vars parecen contener datos de imagen legítimos: su tamaño se informa y los objetos no son nulos.

Así que después de hacer algunas búsquedas en Google, encontré una solución que requiere pasar por una etapa de CGImage; vis:

CGImageRef outputImageRef = [context createCGImage:filterOutputImage fromRect:[filterOutputImage extent]]; 
self.modifiedPhoto = [UIImage imageWithCGImage:outputImageRef scale:self.originalPhoto.scale orientation:self.originalPhoto.imageOrientation]; 
self.photoImageView.image = self.modifiedPhoto; 
CGImageRelease(outputImageRef); 

Este segundo enfoque funciona: obtengo la imagen correcta que se muestra en la vista.

¿Puede alguien explicarme por qué mi primer intento falló? ¿Qué estoy haciendo mal con el método imageWithCIImage que está dando como resultado una imagen que parece existir pero que no se puede mostrar? ¿Siempre es necesario "atravesar" una etapa de CGImage para generar un UIImage desde un CIImage?

Esperar a alguien puede aclarar mi confusión :)

H.

Respuesta

8

Asumo que self.photoImageView es una UIImageView? Si es así, al final, va a llamar al -[UIImage CGImage] en el UIImage y luego pasar ese CGImage como la propiedad contents de un CALayer.

(Véanse los comentarios: más detalles estaban equivocados)

por la documentación UIImage para -[UIImage CGImage]:

If the UIImage object was initialized using a CIImage object, the 
value of the property is NULL. 

Así que la UIImageView llama -CGImage, pero que se traduce en NULL, por lo que no se muestra nada.

No he probado esto, pero se puede intentar hacer una UIView costumbre y luego utilizando métodos de -draw... UIImage en -[UIView drawRect:] para dibujar el CIImage.

+0

Ahh! Gracias. Sí, el photoImageView es un UIImageView. No tenía idea de que usaba la propiedad CGImage del UIImage. – Hamster

+0

Una pregunta más, ¿en qué documento se explica cómo UIImageView muestra su imagen? Estoy tratando de averiguar dónde aprendiste eso desde :) – Hamster

+0

En realidad, ahora que realmente miro el código binario: UIImageView sobrescribe -drawRect: en lugar de llamar a setContents: en su propio CALayer. Parece que finalmente llama a los métodos de dibujo UIImage, que toman el CGImageRef y lo dibujan. Entonces, el mismo resultado, pero mis detalles estaban equivocados. – iccir

15

Esto debería hacerlo!

-(UIImage*)makeUIImageFromCIImage:(CIImage*)ciImage 
{ 
    self.cicontext = [CIContext contextWithOptions:nil]; 
    // finally! 
    UIImage * returnImage; 

    CGImageRef processedCGImage = [self.cicontext createCGImage:ciImage 
                 fromRect:[ciImage extent]]; 

    returnImage = [UIImage imageWithCGImage:processedCGImage]; 
    CGImageRelease(processedCGImage); 

    return returnImage; 
} 
Cuestiones relacionadas