2012-02-01 18 views
10

Sto utilizzando alcuni filtri CoreImage per elaborare un'immagine. Applicando il filtro alla mia immagine di input si ottiene un'immagine di output chiamata filterOutputImage di tipo CIImage.Creazione di UIImage da CIImage

ora desidero visualizzare l'immagine, e provato a fare:

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

Tuttavia la vista è vuota - viene visualizzato nulla.

Se aggiungo la registrazione dichiarazioni che stampano i dettagli relativi sia filterOutputImage e self.modifiedPhoto, tali dichiarazioni sono logging me dimostrando che entrambe queste Vars sembrano contenere dati dell'immagine legittima: sono stati segnalati la loro dimensione e gli oggetti non sono nulle.

Quindi, dopo aver effettuato alcune ricerche su Google, ho trovato una soluzione che richiede di passare attraverso una fase 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); 

Questo secondo approccio funziona: io sono sempre l'immagine corretta visualizzato nella vista.

Qualcuno può spiegarmi perché il mio primo tentativo è fallito? Cosa sto facendo male con il metodo imageWithCIImage che risulta in un'immagine che sembra esistere ma non può essere visualizzata? È sempre necessario "passare attraverso" una fase CGImage per generare un UIImage da una CIImage?

sperando che qualcuno possa chiarire la mia confusione :)

H.

risposta

8

presumo che self.photoImageView è un UIImageView? In tal caso, in definitiva, chiamerà -[UIImage CGImage] su UIImage e quindi passerà a CGImage come proprietà contents di un CALayer.

(Vedere i commenti: i miei dati erano sbagliati)

Per la documentazione UIImage per -[UIImage CGImage]:

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

Così l'UIImageView chiamate -CGImage, ma che si traduce in NULL, in modo da non viene visualizzato nulla.

Non ho provato questo, ma si potrebbe provare a fare un'UIView personalizzato e quindi utilizzando i metodi di -draw... UIImage in -[UIView drawRect:] per disegnare il CIImage.

+0

Ahh! Grazie. Sì, PhotoImageView è UIImageView. Non avevo idea che usasse la proprietà CGImage di UIImage. – Hamster

+0

Un'altra domanda, in quale documento viene spiegato come UIImageView mostra la sua immagine? Sto cercando di scoprire da dove l'hai imparato da :) – Hamster

+0

In realtà, ora che effettivamente guardo il codice binario: UIImageView sovrascrive -drawRect: piuttosto che chiamare setContents: sul proprio CALayer. Sembra che alla fine richiami i metodi di disegno UIImage, che catturano il CGImageRef e lo disegnano. Quindi, stesso risultato, ma i miei dettagli erano sbagliati. – iccir

15

Questo dovrebbe farlo!

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