美文网首页
iOS CIImage 转UIImage后无法保存的问题

iOS CIImage 转UIImage后无法保存的问题

作者: 西瓜吃了吗 | 来源:发表于2021-11-18 11:26 被阅读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对象就可以保存了

相关文章

网友评论

      本文标题:iOS CIImage 转UIImage后无法保存的问题

      本文链接:https://www.haomeiwen.com/subject/ssddtrtx.html