关于可可触摸:如何将UIImage转换为CIImage,反之亦然

How to Convert UIImage to CIImage and vice versa

我正在尝试从屏幕上显示的ImageView中获取CIImage

1
UIImage *image = myImageView.image;

将图像UIImage转换为CIImage

1
CIImage *cImage = [....];

如何执行此操作?


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

要修复myUIImage.CIImage返回nil(如[UIImageView image])的情况,您可以改为执行[CIImage imageWithCGImage:myUIImage.CGImage] – Dylan Hand

快速版本:

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

要修复myUIImage.CIImage返回nil的情况,可以改为执行CIImage(cgImage: myUIImage!.cgImage!)


虽然王长兴的回答实际上是正确的,但苹果表示UIImage.CIImage并不总是有效。具体来说,来自PocketCoreImage:

1
2
3
4
// 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还使用以下内容,这些内容对我不起作用:

1
[UIImage imageWithCIImage:_filteredImage]

根据这篇文章改编的我的个人实现确实对我有用:

1
2
3
4
5
// 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
2
UIImage* u =[UIImage imageNamed:@"image.png"];
CIImage* ciimage = [[CIImage alloc] initWithCGImage:u.CGImage];

现在使用ciimage ...

和Swift版本:

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

(if let语句中的固定错字)


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

1
2
3
4
5
6
7
8
9
- (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,将会遇到问题。例如,调用

1
2
3
4
NSData * UIImageJPEGRepresentation (
   UIImage *image,
   CGFloat compressionQuality
);

将返回nil


1
2
3
4
5
6
7
func toCIImage(image: UIImage) -> CIImage {
    return image.CIImage ?? CIImage(CGImage: image.CGImage!)
}

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


迅速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


changx答案的快速示例:

1
2
guard let ciimage = CIImage(image: uiimage) else { return }
let image = UIImage(CIImage: ciimage)


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

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