Создание UIImage из CIImage - PullRequest
       42

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

10 голосов
/ 01 февраля 2012

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

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

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

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

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

Итак, после некоторого поиска в Google, я нашел решение, которое требует прохождения стадии 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?

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

H.

Ответы [ 2 ]

16 голосов
/ 08 марта 2012

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

-(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;
}
8 голосов
/ 01 февраля 2012

Я предполагаю, что 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, а затем использовать -draw... методы UIImage в -[UIView drawRect:] для рисования CIImage.

...