为了适应多平台,也是满足跨平台的要求,有时候必须转换。因为rgb像素在windows上是按照BGRBGR这样的顺序存储的,而在OS X上则是按照RGBRGB存储。所以如果不做转换,必然在某个平台上出现色差。这里主要演示如何在OS X上实现这种转换。

1.第一种方法最为简单也最慢,就是写一个循环,交换R和B的位置。

Uint8 tmpValue = 0;
for(int i = 0; i < numOfPixels; i+=3)
{tmpValue = pixelBuffer[i];pixelBuffer[i] = pixelBuffer[i + 2];pixelBuffer[i + 2] = tmpValue;
}

2.第二种相当快了,使用accelerate.framwork,不过一个较大的限制是最低系统版本要求iOS5,所以使用范围受到了限制。但是不考虑兼容性的话性能提升还是很厉害的。

- (void)transformRGBToBGR:(const UInt8 *)pict
{rgb.data = (void *)pict;vImage_Error error = vImageConvert_RGB888toPlanar8(&rgb,&red,&green,&blue,kvImageNoFlags);if (error != kvImageNoError) {NSLog(@"vImageConvert_RGB888toPlanar8 error");}error = vImageConvert_Planar8toRGB888(&blue,&green,&red,&bgr,kvImageNoFlags);if (error != kvImageNoError) {NSLog(@"vImageConvert_Planar8toRGB888 error");}free((void *)pict);}

这里首先将内存分布为BGR的数据转换为平面数据,需要三个同原始图像一样宽高的缓冲区存储解析出的R/G/B数据,接下来就可以使用vImageConvert_Planar8toRGB888随意重组他们的顺序,当然要合理,如果你胡乱重组排序的,整合出来的图像肯定是不对的。

由于vImageConvert_Planar8toRGB888和vImageConvert_RGB888toPlanar8都是使用neon汇编优化过的,所以速度很快,几乎已经达到极限了。但是仔细观察,可能就会发现,这种方式需要同样大小的较多的额外存储,尤其是这种函数作为核心函数被调用的次数相当高,导致频繁的分配和释放内存,因而造成内存碎片,影响系统系能。因此,这里就引出了终极解决方案。

3.最快的且节能内存的就是这种方法了,即直接使用neon汇编编写,而不是调用第三方的函数来完成。当数据量较大时,频繁的复制和移动数据废除耗时,而这种方案就可以避免这个问题。相比第二种方法,这种方法节约了2ms,你可能会说,看上去并不是很明显。可是当你了解了CPU的主频也就900MHZ时,你就知道提升不小了。

- (void) neon_asm_convert_BGR_TO_RGB:(UInt8 *) img numPixel:(int) numPixels24
{// numPixels is divided by 24__asm__ volatile("0:                \n""# load 3 64-bit regs with interleave: \n""vld3.8      {d0,d1,d2}, [%0]   \n""# swap d0 and d2 - R and B\n""vswp d0, d2   \n""# store 3 64-bit regs: \n""vst3.8      {d0,d1,d2}, [%0]!      \n""subs        %1, %1, #1       \n""bne         0b            \n":: "r"(img), "r"(numPixels24): "r4", "r5");
}

第三种解决方案引自http://stackoverflow.com/questions/11683864/on-ios-how-to-quickly-convert-rgb24-to-bgr24

转载于:https://www.cnblogs.com/CoderPlace/archive/2012/07/30/2615793.html

iOS 转换BGR24 为 RGB24相关推荐

  1. javacpp-FFmpeg系列之2:通用拉流解码器,支持视频拉流解码并转换为YUV、BGR24或RGB24等图像像素数据...

    javacpp-ffmpeg系列: javacpp-FFmpeg系列之1:视频拉流解码成YUVJ420P,并保存为jpg图片 javacpp-FFmpeg系列之2:通用拉流解码器,支持视频拉流解码并转 ...

  2. [iOS 转换东八区] 将手机当前时区全都转为东八区

    // 获取当前时间 - (NSArray*)getCurrentTime{NSDate *date = [NSDate date];NSDateFormatter *format = [[NSDate ...

  3. ios转换html标签,iOS html标签解析解决方案

    由于项目是基于b/s结构,因为在pc端上是没有客户端这概念只有浏览器,而对于web与移动端的关系,实际上还是类似于C/S结构,因此web端与web端的通信是通过发送HTML5标签来实现,常规的做法中p ...

  4. 【Codecs系列】颜色空间转换CSconvert:NV21转BGR24和BGR24转NV21

    title: 颜色空间转换CSconvert:NV21转BGR24和BGR24转NV21 date: 2019-08-09 22:13:47 categories: 技术 音视频技术 tags: Co ...

  5. 【iOS开发】跨平台开发再次袭来

    转自喵神博客:点击打开链接 这篇文章主要想谈谈最近又刮起的移动开发跨平台之风,并着重介绍和对比一下像是Xamarin,NativeScript 和 React Native 之类的东西.不会有特别深入 ...

  6. 【音视频】流媒体直播实时视频延迟时间排查和剖析:gop关键帧间隔导致延迟,流媒体和播放器缓存,B帧等导致的延迟

    本章是流媒体直播实时视频延迟时间排查和剖析 javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频 ...

  7. 只知道用c++搞音视频?来来来,javacv了解一下

    javacv是什么?javacv技术栈能做什么? 大家肯定对javacv很感兴趣,恰巧博主对javacv稍有涉猎,这就来给各位小伙伴们安利一番,javacv到底可以做什么,可以在哪些领域独领风骚. j ...

  8. javacv实现实时视频截图和录像服务easyCV,支持png,jpg截图以及gif,apng动态图片录制

    本项目维护于github:https://github.com/eguid/easyCV 更新日志 2019年4月更新: 1.新增两个springboot+postgre的演示demo 2.去除了co ...

  9. 笔耕不辍,持续更新六年的高质量java流媒体音视频和人工智能教程值得大家拥有

    高度内卷时代,躺平是不可能躺平的,这辈子都不可能躺平. 身为java程序猿还停留在只会增删改查吗?写了几年代码还是只会spring全家桶?在java这个拥挤赛道中想要以技术立身于不败之地,不如来看看j ...

最新文章

  1. 【JZOJ5064】【GDOI2017第二轮模拟day2】友好城市 Kosarajo算法+bitset+ST表+分块
  2. 有了这款可视化工具,Java 应用性能分析、调优 so easy...
  3. Linux下如何实现用户的集中管理(NIS服务器的高级配置)
  4. AI算法不断突破 人工智能驱动创新需找对方向
  5. 2021年春节联欢晚会第三次联排亮点多
  6. leetcode874
  7. c语言 自动测试,C语言测试。自己实现scandir 函数
  8. verilog中assign语句
  9. java method_JAVA Method的解析
  10. 产品经理经验谈100篇(八)-产品经理分析框架解析
  11. 05-不借用第三个变量实现两个变量值互换(运算符)
  12. X-Scan介绍和使用方法
  13. Grad-CAM在语义分割中的pytorch实现
  14. 计算机网络--基站 NFC 蓝牙 RFID ETC 云计算 云桌面
  15. MIPI接口和DVP接口摄像头学习笔记
  16. 使用Pr编辑字幕-快闪效果
  17. 数字逻辑课上如何制作FPGA游戏?
  18. mysql根据字符转行
  19. linux识别不了喇叭,Ubuntu扬声器无声的解决方法
  20. 如何使用uTorrent制作自己的种子

热门文章

  1. SQL Server 2008 正式版安装指南(附序列号)
  2. C语言程序设计的常用算法
  3. NVIDIA NeMo User Guide
  4. 做事情的价值和看待方式
  5. 以后开药的时候,最后一定问一句,哪些药有激素
  6. 面试的时候的要注意的case应该怎么分析
  7. ae的渲染引擎:cineware
  8. 【转】GLSL资料收集
  9. #region 常量和静态变量静态类readonly
  10. vc2008中使用boost库