How to Convert UIImage to CIImage and vice versa
我正在尝试从屏幕上显示的ImageView中获取
1 | UIImage *image = myImageView.image; |
将图像
1 | CIImage *cImage = [....]; |
如何执行此操作?
1 2 | CIImage *ciImage = [UIImage imageNamed:@"test.png"].CIImage; UIImage *uiImage = [[UIImage alloc] initWithCIImage:ciImage]; |
要修复
快速版本:
1 2 | let ciImage = UIImage(named:"test.png")!.ciImage let uiImage = UIImage(ciImage: ciImage) |
要修复
虽然王长兴的回答实际上是正确的,但苹果表示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; } |
1 2 3 4 | NSData * UIImageJPEGRepresentation ( UIImage *image, CGFloat compressionQuality ); |
将返回
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
https://developer.apple.com/documentation/uikit/uiimage/1624090-init
CIImage> UIImage
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; |