我正在尝试从屏幕上显示的ImageView中获取CIImage
。
UIImage *image = myImageView.image;
将图像UIImage
转换为CIImage
。
CIImage *cImage = [....];
如何做到这一点?
我正在尝试从屏幕上显示的ImageView中获取CIImage
。
UIImage *image = myImageView.image;
将图像UIImage
转换为CIImage
。
CIImage *cImage = [....];
如何做到这一点?
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!)
。
虽然Changxing Wang的回答基本上是正确的,但苹果表示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]];
这是最兼容的方法:
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语句中修正了拼写错误)
这是一个完整的代码示例,我在我的项目中使用过。
- (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
。
func toCIImage(image: UIImage) -> CIImage {
return image.CIImage ?? CIImage(CGImage: image.CGImage!)
}
func toUIImage(image: CIImage) -> UIImage {
return UIImage(CIImage: image)
}
Swift 3/4
UIImage > CIImage
使用以下代码将UIImage转换为CIImage:
let ciimage = CIImage(image: image)
参考链接:https://developer.apple.com/documentation/uikit/uiimage/1624090-init
CIImage > UIImage
使用以下代码将CIImage转换为UIImage:
let image = UIImage(ciImage: ciimage)
参考链接:https://developer.apple.com/documentation/coreimage/ciimage/1624119-init
以下是changx的答案,Swift示例:
guard let ciimage = CIImage(image: uiimage) else { return }
let image = UIImage(CIImage: ciimage)
当将UIImage转换为CIImage时,我遇到了两种情况,有时它是nil,有时不是。下面的代码解决了这个问题:
CIImage *ciImage;
ciImage=[[CIImage alloc] initWithImage:imageToConvert];
if (ciImage==nil)
ciImage=imageToConvert.CIImage;
[UIImage imageWithCIImage:ciImage]
等同于[[[UIImage alloc] initWithCIImage:ciImage] autorelease]
。 - Adam KaplanCGImageRef
初始化UIImage
,则CIImage
将为nil
,这段代码将无法正常工作。 - Mr Rogers...WithCIImage:
创建的UIImage
在调整大小时存在一些问题,因为大多数使用UIImage
的框架需要一个CGImage
。因此,您需要首先使用createCGImage:fromRect:
或类似的方法进行渲染。 - BinarianmyUIImage.CIImage
返回nil
的情况,你可以使用[CIImage imageWithCGImage:myUIImage.CGImage]
。 - Dylan Hand