照片时间,是我个人开发的一款显示照片拍摄时间的应用,实用、免费、体积小。
http://itunes.apple.com/app/id571238224

最近做一个视频处理的项目(Rokk!),需要将opengl渲染后的特效保存为视频,由于使用了第三方库,所以不能直接使用opengl的framebuffer,后面使用了一种比较蛋疼的方式:使用glReadPixels来读取每一个渲染帧,转换为UIImage,然后将UIImage转换为CVPixelBufferRef,使用AVAssetWriterInputPixelBufferAdaptor和AVAssetWriter保存CVPixelBufferRef,最后生成视频。【此处应该有很多改进空间,希望能够多多交流】。
在上述过程中,遇到了很多坑,其中就包含“UIImage转换为CVPixelBufferRef”,网上有蛮多关于这方面的代码的,但是真正没有什么bug的,太少了,综合了各家的代码,最终我得到了相对比较正确、简洁的代码:
- (CVPixelBufferRef)pixelBufferFromCGImage:(CGImageRef)image{

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey,[NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey,nil];CVPixelBufferRef pxbuffer = NULL;CGFloat frameWidth = CGImageGetWidth(image);
CGFloat frameHeight = CGImageGetHeight(image);CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault,frameWidth,frameHeight,kCVPixelFormatType_32ARGB,(__bridge CFDictionaryRef) options,&pxbuffer);NSParameterAssert(status == kCVReturnSuccess && pxbuffer != NULL);CVPixelBufferLockBaseAddress(pxbuffer, 0);
void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer);
NSParameterAssert(pxdata != NULL);CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();CGContextRef context = CGBitmapContextCreate(pxdata,frameWidth,frameHeight,8,CVPixelBufferGetBytesPerRow(pxbuffer),rgbColorSpace,(CGBitmapInfo)kCGImageAlphaNoneSkipFirst);
NSParameterAssert(context);
CGContextConcatCTM(context, CGAffineTransformIdentity);
CGContextDrawImage(context, CGRectMake(0,0,frameWidth,frameHeight),image);
CGColorSpaceRelease(rgbColorSpace);
CGContextRelease(context);CVPixelBufferUnlockBaseAddress(pxbuffer, 0);return pxbuffer;

}

重要经验八---UIImage转换为CVPixelBufferRef相关推荐

  1. UIImage存为本地文件与UIImage转换为NSData

    UIImage *image=@"XXX"; //png格式 NSData *imagedata=UIImagePNGRepresentation(image); //JEPG格式 ...

  2. 【生活工作经验 八】掌握大局,MBA考前调研

    最近在给自己制定职业生涯规划,并且结合公司的职级职等制度,想要走M路线,而MBA无疑是一个重要的资本,好处有如下几种: 拓展视野和思维,跳出当前的局限,接受系统的管理者培养体系 拓展人脉,结识各行各业 ...

  3. 并发经验八年架构师:带你轻松解决缓存在高并发场景下的问题

    缓存一致性问题 当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致,不能出现差异现象.这就比较依赖缓存的过期和更新策略.一般会在数据发生更改 ...

  4. 并发经验八年架构师:缓存在高并发场景下该如何问题

    缓存一致性问题 当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致,不能出现差异现象.这就比较依赖缓存的过期和更新策略.一般会在数据发生更改 ...

  5. 手把手教你在应用里用上iOS机器学习框架Core ML

    2017-06-10 Cocoa开发者社区 2017年的WWDC上,苹果发布了Core ML这个机器学习框架.现在,开发者可以轻松的使用Core ML把机器学习功能集成到自己的应用里,让应用变得更加智 ...

  6. 苹果AI秀——Core ML强势来袭

    前言 最近WWDC2017刚刚过去两周,作为iOS客户端开发的我,看到了苹果高逼格的Core ML,决定花两天研究研究. 其实机器学习在移动端应用已经有了一定的支持了,Caffe2 已经支持iOS.A ...

  7. CVPixelBufferRef与UIImage的互相转换

    CVPixelBufferRef与UIImage的互相转换 // // ViewController.m // test_image_covert_data_01 // // Created by j ...

  8. sybase性能优化经验浅谈

    http://www.2cto.com/database/201204/129094.html 使用sybase数据库多年,有些经验,在数据库部署配置得当,平时监控维护做到位情况下,除此之外数据库的性 ...

  9. 人工智能作业 八数码启发式搜索与bfs比较

    问题描述 3×3九宫棋盘,放置数码为1 -8的8个棋牌,剩下一个空格,只能通过棋牌向空格的移动来改变棋盘的布局. 要求:根据给定初始布局(即初始状态)和目标布局(即目标状态),如何移动棋牌才能从初始布 ...

最新文章

  1. hdu 1272 小希的迷宫
  2. Makefile 里的 subst 函数
  3. Web性能测试需监控的IIS性能指标
  4. python计角_最小角python算法
  5. 亿级用户下的新浪微博平台架构阅读心得
  6. nginx 路由配置
  7. mysql安全补丁如何处理_3分钟学会mysql数据库的逻辑架构原理
  8. NET Core中使用Irony实现自己的查询语言语法解析器
  9. [js] 请使用js实现商品的自由组合,并说说你的思路
  10. fileziller 恢复 站点管理器 内的ftp帐号方法
  11. Unicode 和 UTF-8 的区别
  12. 学习数据结构与算法分析如何帮助您成为更优秀的开发人员
  13. NHibernate版本不一致问题
  14. 教大家如何选购直播声卡
  15. Server 安装 caffee
  16. 去掉txt文本某些字符
  17. 软件测试的维护,浅谈如何维护软件测试用例
  18. CTF学习之0基础入门笔记(一)
  19. 车载syu一android密码,教务系统找回密码
  20. CSS子元素选择父元素

热门文章

  1. java和.net 双语言开发框架,开源的PaaS平台
  2. 记录一下 yum install *** 报错问题:failure: repodata/repomd.xml from tvinternal_dev: [Errno 256] No more mirr
  3. C语言试题115之两个乒乓球队进行比赛,各出三人。甲队为 a,b,c 三人,乙队为 x,y,z 三人。已抽签决定 比赛名单。有人向队员打听比赛的名单。a 说他不和 x 比,c 说他不和 x,z 比,请
  4. Android动画(一)
  5. unity5在小米pad上闪退
  6. TencentOS tiny危险气体探测仪产品级开发
  7. 彻底卸载智能云输入法(在win10家庭版下)
  8. Python大数据分析之实时疫情数据可视化(含代码)
  9. 我与MVVM的恩怨情仇
  10. 解决size mismatch for embedding.embed_dict.userid.weight