Создание 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;
}