关闭

UIImage vs CIImage vs CGImage

标签: ios图片GPU
354人阅读 评论(0) 收藏 举报
分类:

公司项目中需要对图片进行滤镜处理,故学习了ios CoreImage中CIFilter相关知识。
出现了一个奇怪的问题,如果下面这么写的话,会出现野指针EXC_BAD_ACCESS的情况,通过ZombieObject定位到是在使用滤镜输出的UIImage给UIImageView.image赋值的时候出现的崩溃。
这种方式是UIImage转换成CIImage,滤镜处理后,直接转回UIImage。

//黑白效果
    func noir() -> UIImage?
    {
        let imageData = UIImagePNGRepresentation(self)
        let inputImage = CoreImage.CIImage(data: imageData!)
        guard let filter = CIFilter(name:"CIPhotoEffectNoir") else {return nil}
        filter.setValue(inputImage, forKey: kCIInputImageKey)
        if let outputImage = filter.outputImage {
            let image = UIImage.init(ciImage: outputImage)
            return image
        }
        return nil
    }

经过查询苹果开发者网站和Github上的滤镜使用实例后,改为下面的方法,没有发生崩溃。
区别有二:
1,UIImage->CIImage的方式,改为直接创建
2,CIImage->UIImage的方式,改为CIImage->CGImage->UIImage。

func noir() -> UIImage?
    {
        let inputImage = CIImage(image: self)
        guard let context = CIContext.mara_context(options: nil) else {return nil}
        guard let filter = CIFilter(name:"CIPhotoEffectNoir") else {return nil}
        filter.setValue(inputImage, forKey: kCIInputImageKey)
        if let outputCIImage = filter.outputImage {
            guard let outputCGImage = context.createCGImage(outputCIImage, from: outputCIImage.extent) else {return nil}
            let image = UIImage(cgImage: outputCGImage)
            return image
        }
        return nil
    }

解释一下CIImage CGImage UIImage的区别:
UIImage是显示图像数据的高层方式。可以从文件,或者原始图像数据生成UIImage对象。这些数据在初始化时就不可变了。
CIImage对象也是线程安全的,它并不是一张图片。它包含了所有生成一张图片所有的必要信息。CIImage对象通常用在CIFilter, CIContext, CIColor, CIVector。跟GPU的处理相关。
CGImage,只能表示位图。如果需要访问和改变实际的位图数据的话,可以用CGImage。
Core Image与OpenGL可互操作,可以在View的draw方法中用OpenGL来提高性能:

let eaglContext = EAGLContext(API: .OpenGLES2)
let ciContext = CIContext(EAGLContext: eaglContext)
//滤镜处理
// ...
ciContext.drawImage(filter.outputImage, inRect: outputBounds, fromRect: inputBounds)


2017/9/14追记
由于程序上线前测试不足,上线一天后,在adoption为50%左右的情况下,还是出现了3次crash。崩溃栈信息如下:
崩溃堆栈
Google到有人有类似的问题并用下面的方法解决,10K MAU上线4天没有上报崩溃。

EAGLContext.setCurrent(nil)
guard let context = CIContext.mara_context(options: nil) else {return nil}


参考:
1,https://medium.com/@ranleung/uiimage-vs-ciimage-vs-cgimage-3db9d8b83d94
2,https://objccn.io/issue-21-6/

1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Swift之CIImage、CGImage、UIImage之间的相互转换

Swift之CIImage、CGImage、UIImage之间的相互转换 iOS开发中对于Image的对象有三种形式CIImage、CGImage、UIImage,有时候我们通常需要三者之间进行转换,下面简单介绍一下: CIImage转UIImage// CIImage转UIImage相对简单,...
  • iTaacy
  • iTaacy
  • 2017-04-05 15:33
  • 1348

UIImage的imageOrientation属性 修改图片旋转了的bug

本回要从我们项目说起,今天测试的给我叫去,问我这个图片裁剪是不是有BUG,从手机相册里选的图(iOS设备)裁剪出来怎么就.....(省略好多字)。 当时本大侠就想 NND当时我做的时候就用模拟器测试的,一直从相册选照片,也没遇见这样的情况啊,我一声断喝:“呆!图片传给我,待劳资观瞧一番!”...
  • u013430014
  • u013430014
  • 2015-05-28 15:23
  • 2918

YUV 420P IOS中的呈现

经过3个工作日(周六下午及加班,周一,今天上午)总算将解码的图像展现出来了,期间经历一些曲折,主要是前述中的"想通过原始YUV数据,重建CVPixelBufferRef类型的数据,进而可   1)转为CIImage,UIImage然后调用performSelectorOnMain...
  • dabang_007
  • dabang_007
  • 2014-02-25 15:28
  • 7774

IOS图像处理之 coreImage.

最近的项目中,要用到图像处理,查了很多资料,最后用一些网上比较山寨d
  • lvmaker
  • lvmaker
  • 2014-08-05 15:24
  • 18479

iOS 开发之Resize UIimage的三种方法

Method 1: Using UIKit + (UIImage*)imageWithImage:(UIImage*)image scaledToSize:(CGSize)newSize; { // Create a graphics image context UIGraphic...
  • bl1988530
  • bl1988530
  • 2013-04-26 01:37
  • 1380

iOS 关于UIImage的处理总结

获取最常见颜色并透明化,设置图片透明度,合成图片,获取图片点对应的颜色,压缩图片
  • rpf2014
  • rpf2014
  • 2016-09-20 17:39
  • 613

浅析 UIImage 的2种加载方式对内存的影响

A、 UIImage的2种加载方式: 方式一:有缓存(图片所占用的内存会一直停留在程序中) + (nullable UIImage *)imageNamed:(NSString *)name;  // ...
  • explore_zhang
  • explore_zhang
  • 2015-12-29 12:18
  • 1815

UIimage的缩放,马赛克处理,CVPixelBufferRef 转换为UIimage

UIimage类别点击下载demo demo里面还有一个计算文件大小的方法//里面有5个方法 //1、 CVPixelBufferRef 转换为UIimage //2、UIimage 缩放指定倍数 //3、UIimage 缩放指定大小 //4、图片马赛克处理 //5、图片马赛克处理 #import...
  • yutaotst
  • yutaotst
  • 2016-12-08 16:36
  • 2604

脚本VS插件VS应用程序VS控件

脚本(script)是使用一种特定的描述性语言,依据一定的格式编写的可执行文件,又称作宏或批处理文件。
  • u010145745
  • u010145745
  • 2014-06-20 00:57
  • 607

燕郊vs香河vs廊坊vs武清vs固安vs涿州vs保定

http://house.focus.cn/msgview/8122/336516247.html
  • hshl1214
  • hshl1214
  • 2017-02-20 16:12
  • 345
    个人资料
    • 访问:33889次
    • 积分:783
    • 等级:
    • 排名:千里之外
    • 原创:39篇
    • 转载:4篇
    • 译文:6篇
    • 评论:12条
    最新评论