Как конвертировать UIImage в CIImage и наоборот - PullRequest
61 голосов
/ 08 декабря 2011

Я пытаюсь получить CIImage из ImageView, которые отображаются на экране.

UIImage *image = myImageView.image;

конвертировать изображение UIImage в CIImage.

CIImage *cImage = [....];

Как это сделать?

Ответы [ 8 ]

117 голосов
/ 08 декабря 2011
CIImage *ciImage = [UIImage imageNamed:@"test.png"].CIImage;
UIImage *uiImage = [[UIImage alloc] initWithCIImage:ciImage];

Чтобы исправить случай, когда myUIImage.CIImage возвращает nil как [UIImageView image], вместо этого вы можете сделать [CIImage imageWithCGImage:myUIImage.CGImage] - Дилан Хэнд

Swift версия:

let ciImage = UIImage(named: "test.png")!.ciImage
let uiImage = UIImage(ciImage: ciImage)

Исправить случай, когда myUIImage.ciImage возвращает nil, как вы можете вместо этого сделать CIImage(cgImage: myUIImage!.cgImage!).

31 голосов
/ 20 июня 2012

В то время как ответ Чансина Вана является действительно правильным, Apple говорит, что UIImage.CIImage не всегда будет работать. В частности, из PocketCoreImage:

// Create a CIImage from the _inputImage.  While UIImage has a property returning
// a CIImage representation of it, there are cases where it will not work.  This is the
// most compatible route.
_filteredImage = [[CIImage alloc] initWithCGImage:_inputImage.CGImage options:nil];

Apple также использует следующее, которое НЕ работает для меня:

[UIImage imageWithCIImage:_filteredImage] 

Моя личная реализация, адаптированная из этот пост действительно работает для меня:

// result is a CIImage, output of my filtering.  
// returnImage is (obviously) a UIImage that I'm going to return.
CIContext *context = [CIContext contextWithOptions:nil];
UIImage *returnImage = 
[UIImage imageWithCGImage:[context createCGImage:result fromRect:result.extent]];
19 голосов
/ 24 апреля 2013

Это наиболее совместимый способ сделать это:

UIImage* u =[UIImage imageNamed:@"image.png"];
CIImage* ciimage = [[CIImage alloc] initWithCGImage:u.CGImage];

теперь используйте ciimage ...

и Swift версия:

let i1 = UIImage(named: "testImage")
if let cgi1 = ui?.cgImage {
   let ci = CIImage(cgImage: cgi1)
   //use ci
}
13 голосов
/ 18 марта 2015

Вот полный пример кода, который я использовал в своих проектах.

- (UIImage *)makeUIImageFromCIImage:(CIImage *)ciImage {
    CIContext *context = [CIContext contextWithOptions:nil];
    CGImageRef cgImage = [context createCGImage:ciImage fromRect:[ciImage extent]];

    UIImage* uiImage = [UIImage imageWithCGImage:cgImage];
    CGImageRelease(cgImage);

    return uiImage;
}

CIImage в основном рецепт для изображения. Вы столкнетесь с проблемами, если попытаетесь напрямую конвертировать из CIImage в UIImage. Например, позвонив

NSData * UIImageJPEGRepresentation (
   UIImage *image,
   CGFloat compressionQuality
);

вернет nil.

11 голосов
/ 07 сентября 2015
func toCIImage(image: UIImage) -> CIImage {
    return image.CIImage ?? CIImage(CGImage: image.CGImage!)
}

func toUIImage(image: CIImage) -> UIImage {
    return UIImage(CIImage: image)
}
4 голосов
/ 16 июня 2016

Быстрый пример ответа changx :

guard let ciimage = CIImage(image: uiimage) else { return }
let image = UIImage(CIImage: ciimage)
3 голосов
/ 01 марта 2018

Swift 3/4

UIImage> CIImage

let ciimage = CIImage(image: image)

https://developer.apple.com/documentation/uikit/uiimage/1624090-init

CIImage> UIImage

let image = UIImage(ciImage: ciimage)

https://developer.apple.com/documentation/coreimage/ciimage/1624119-init

1 голос
/ 27 мая 2018

При преобразовании UIImage в CIImage у меня было 2 отдельных случая, где иногда ноль, а иногда нет.Ниже код решил это:

CIImage *ciImage;
ciImage=[[CIImage alloc] initWithImage:imageToConvert];
if (ciImage==nil)
    ciImage=imageToConvert.CIImage;
...