如何将UIImage转换为CIImage,反之亦然


Answers:


129
CIImage *ciImage = [UIImage imageNamed:@"test.png"].CIImage;
UIImage *uiImage = [[UIImage alloc] initWithCIImage:ciImage];

要解决类似这样的myUIImage.CIImage回报问题,您可以改用– Dylan Handnil[UIImageView image][CIImage imageWithCGImage:myUIImage.CGImage]

迅捷版:

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

要解决类似myUIImage.ciImage返回的情况,nil您可以这样做CIImage(cgImage: myUIImage!.cgImage!)


3
对于它的价值,总会有一个调用alloc ...[UIImage imageWithCIImage:ciImage]等效于[[[UIImage alloc] initWithCIImage:ciImage] autorelease]
Adam Kaplan

51
请注意。如果将UIImage初始化为CGImageRef CIImage将是nil,它将无法正常工作。
罗杰斯先生

4
UIImage与创建...WithCIImage:确实有一些问题,调整大小,因为大多数的框架有UIImage需要的CGImage。因此,您需要先使用createCGImage:fromRect:或类似的东西渲染它。
Binarian

2
要解决myUIImage.CIImage返回的情况nil,您可以改为执行[CIImage imageWithCGImage:myUIImage.CGImage]
迪伦·汉德

如果可能,最好使用imageWithCIImage:scale:orientation而不是imageWithCIImage CIImage * aCIImage = [CIImage imageWithData:imageData]; UIImage * anImage = [UIImage imageWithCIImage:aCIImage比例尺:1.0 direction:orientation];
单独

31

尽管王长兴的答案实际上是正确的,但苹果公司表示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];

苹果还使用以下内容,但对我不起作用:

[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]];

1
除非一定要这样做,否则请谨慎设置上下文,因为这通常是一项昂贵的任务。我建议您设置为@property并在处理图像转换之前创建它。但是,如果仅执行一次,则上述解决方案应该可以正常工作。
SushiGrass Jacob

创建的CGImageRef将被保留。您必须保留对它的引用,并在创建UIImage之后调用CGImageRelease(cgimage)。否则,内存将被泄漏
HotJard

您的代码泄漏:[context createCGImage ...]创建必须释放的CGContextRef(即使在ARC中)。由于您没有将其分配给变量,因此无法释放它,并且在此处泄漏了大量内存。
xaphod

23

这是最兼容的方式:

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

现在使用ciimage ...

和Swift版本:

let i1 = UIImage(named: "testImage")
if let cgi1 = i1?.cgImage {
   let ci = CIImage(cgImage: cgi1)
   //use ci
}

(修复了if let语句中的错字)


2
要从UIImage创建CIImage,使用initWithCGImage是唯一可行的解​​决方案。这样做'uiimagei.CIImage不起作用,总是无效。
crojassoto 2014年

13

这是我在项目中使用的完整代码示例。

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


12
func toCIImage(image: UIImage) -> CIImage {
    return image.CIImage ?? CIImage(CGImage: image.CGImage!)
}

func toUIImage(image: CIImage) -> UIImage {
    return UIImage(CIImage: image)
}

它不会转换任何内容,nil如果不是从ciimage构建的,则将返回
user924



1

将UIImage转换为CIImage时,我有2种单独的情况,有时有时为零,有时则为零。下面的代码解决了它:

CIImage *ciImage;
ciImage=[[CIImage alloc] initWithImage:imageToConvert];
if (ciImage==nil)
    ciImage=imageToConvert.CIImage;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.