Создание UIImage из CIImage

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

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

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

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

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

Итак, после выполнения какого-то Googling, я нашел решение, требующее прохождения стадии CGImage; визави:

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?

Надеясь, что кто-то сможет очистить мою путаницу:)

Н.

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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