iOS CIImage 转UIImage后无法保存的问题
2021-11-18 本文已影响0人
西瓜吃了吗
我在做图片滤镜处理的时候遇到一个问题:
CIImage * inputImage = [CIImage imageWithCGImage:image.CGImage];
//创建CIFilter对象
CIFilter * filter = [CIFilter filterWithName:name];
//设置默认参数
[filter setDefaults];
//设置要处理的图像
[filter setValue:inputImage forKey:@"inputImage"];
UIImage* newImg = [UIImage imageWithCIImage:[filter outputImage]];
得到newImg 后,我把newImg保存到相册,结果失败。
这里我们先来看下 CIImage UIImage 以及CGImage的区别:
UIImage
UIImage对象在App中管理图片数据. 使用Image对象来表示所有类型图片的数据, UIImage类具有管理相关平台支持的所有格式图片数据的能力. Image对象并没有提供直接访问相关的图片数据的操作.
CGImage
CGImageRef是一种基于你所提供的样本数据来表示位图(Bitmap Image)和位图遮罩(Bitmap Image Masks)的具体类型. 位图(样本)是像素的矩形阵列(Rectangular Array), 每个像素表示源图中的每个点的数据或样本.
CIImage
CIImage类用于描述一张图片.包含了创建图片的所有必要的数据,但其本身没有渲染成图片,它代表的是图像数据或者生成图像数据的流程(如滤镜).
发现问题
然后我发现直接使用CIImage对象初始化UIImage对象后,UIImage对象的CGImage 属性的值为NULL,导致图片无法保存。
解决问题
这时候,需要先使用CIImage转成CGImage:
CIImage *processedImage = [CIImage imageWithCGImage:image.CGImage];
CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef cgiimage = [context createCGImage:processedImage fromRect:processedImage.extent];
UIImage *image = [UIImage imageWithCGImage:cgiimage];
CGImageRelease(cgiimage);
这样获取的UIImage对象就可以保存了