2012-02-01 5 views
10

Я использую некоторые фильтры CoreImage для обработки изображения. Применение фильтра к моему входному изображению приводит к выходному изображению, называемому filterOutputImage типа CIImage.Создание UIImage из CIImage

Теперь я хочу, чтобы отобразить этот образ, и пытался делать:

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

мнение, однако, является пустым - не отображается ничего.

Если я добавляю инструкции регистрации, которые распечатывают данные об фильтрах и фильтрах selfmodifiedPhoto, те заявления о регистрации указывают на то, что оба эти вара, как представляется, содержат законные данные изображения: их размер сообщается, а объекты не ноль.

Итак, после выполнения некоторых действий в Google, я нашел решение, требующее прохождения этапа 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); 

Этот второй подход работает: я получаю правильное изображение, отображаемое в представлении.

Может кто-нибудь объяснить мне, почему моя первая попытка не удалась? Что я делаю неправильно с методом imageWithCIImage, который приводит к изображению, которое, кажется, существует, но не может быть отображено? Всегда ли нужно «пройти» этап CGImage, чтобы создать UIImage из CIImage?

Надеясь кто-то может прояснить мое замешательство :)

H.

ответ

8

Я предполагаю, что self.photoImageView является UIImageView? Если да, то в конечном итоге он назовет -[UIImage CGImage] на UIImage, а затем передаст этот CGImage как свойство CALayer contents.

(см комментарии: мои детали были неправильно)

За документацию UIImage для -[UIImage CGImage]:

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

Так UIImageView называет -CGImage, но это приводит к NULL, так что ничего не отображается.

Я не пробовал это, но вы можете попробовать сделать пользовательские UIView, а затем с помощью -draw... методов UIImage в -[UIView drawRect:] обратить CIImage.

+0

Ahh! Спасибо. Да, photoImageView - это UIImageView. Я понятия не имел, что он использует свойство CGImage UIImage. – Hamster

+0

Еще один вопрос, в каком документе объясняется, как UIImageView отображает его изображение? Я пытаюсь выяснить, откуда вы это узнали :) – Hamster

+0

Собственно, теперь, когда я действительно смотрю на двоичный код: UIImageView переопределяет -drawRect: вместо вызова setContents: на свой собственный CALayer. Похоже, что в конечном итоге он вызывает методы рисования UIImage, которые захватывают CGImageRef и рисуют его. Итак, тот же результат, но мои данные были неправильными. – iccir

15

Это должно быть сделано!

-(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; 
} 
Смежные вопросы