2012-02-01 16 views
10

Bir görüntüyü işlemek için bazı CoreImage filtreleri kullanıyorum. Filtreyi giriş resmime uygulamak, CIImage türünde filterOutputImage adlı bir çıktı görüntüsüyle sonuçlanır.CIImage öğesinden UIImage oluşturma

Şimdi bu görüntüyü göstermek isteyen ve yapıyor çalıştı:

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

görünüm ancak boştur - hiçbir şey görüntülenmekte olduğunu.

Hem filterOutputImage hem de self.modifiedPhoto ile ilgili ayrıntıları yazdıran günlük ifadeleri eklerseniz, bu günlük bildirimleri, her iki değişkenin de yasal görüntü verileri içerdiği görülüyor: boyutları bildiriliyor ve nesneler sıfır değil.

Bazı Googling yaptıktan sonra, bir CGImage aşamasından geçmeyi gerektiren bir çözüm buldum; 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); 

Bu ikinci yaklaşım çalışır: Ben görünümünde görüntülenen doğru görüntüyü alıyorum.

Birisi bana ilk denememin neden başarısız olduğunu açıklayabilir mi? Ne var ama görünen olamaz bir görüntü ile sonuçlanan imageWithCIImage yöntemi ile yanlış yapıyorum? Bir CIImage'dan bir UIImage oluşturmak için bir CGImage aşamasının "geçmesi" her zaman gerekli midir?

umuduyla Birisi self.photoImageView bir UIImageView olduğunu varsayalım çelişkimi :)

H.

cevap

8

kadar temizleyebilirsiniz? Öyleyse, sonuçta, UIImage üzerinde -[UIImage CGImage] numaralı telefonu arayacak ve ardından CGImage bir CALayer'ın contents özelliği olarak iletecektir.

(yorumlarına bakın: my ayrıntıları yanlış) UIImage belgelerine Başına

-[UIImage CGImage] için:

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

Yani UIImageView -CGImage çağırır, ama bu yüzden hiçbir şey görüntülenir, null ile sonuçlanır.

Bunu denemedim ama CIImage çizmek -[UIView drawRect:] yılında UIImage en -draw... yöntemler kullanılarak daha sonra özel bir UIView yapma ve deneyebilirsiniz.

+0

Ahh! Teşekkür ederim. Evet, photoImageView bir UIImageView. UIImage'ın CGImage özelliğini kullandığı hakkında hiçbir fikrim yoktu. – Hamster

+0

Bir soru daha, UIImageView görüntüsünü nasıl görüntülediğini açıklıyor? Bunu nereden öğrendiğimi bulmaya çalışıyorum :) – Hamster

+0

Aslında, aslında ikili koda bakıyorum: UIImageView overdre'leri -drawRect: setContents'ı çağırmak yerine: kendi CALayer'ında. Nihayetinde CGImageRef'i yakalayıp çizen UIImage çizim yöntemlerini çağırıyor gibi görünüyor. Yani, aynı sonuç, ama detaylar yanlıştı. – iccir

15

Bunu yapmalı!

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