//平面YUV422转平面RGB24
static void YUV422p_to_RGB24(unsigned char *yuv422[3], unsigned char *rgb24, int width, int height)
{
 int R,G,B,Y,U,V;
 int x,y;
 int nWidth = width>>1; //色度信号宽度
 for (y=0;y<height;y++)
 {
  for (x=0;x<width;x++)
  {
   Y = *(yuv422[0] + y*width + x);
   U = *(yuv422[1] + y*nWidth + (x>>1));
   V = *(yuv422[2] + y*nWidth + (x>>1));
   R = Y + 1.402*(V-128);
   G = Y - 0.34414*(U-128) - 0.71414*(V-128);
   B = Y + 1.772*(U-128);
  
   //防止越界
   if (R>255)R=255;
   if (R<0)R=0;
   if (G>255)G=255;
   if (G<0)G=0;
   if (B>255)B=255;
   if (B<0)B=0;
  
   *(rgb24 + ((height-y-1)*width + x)*3) = B;
   *(rgb24 + ((height-y-1)*width + x)*3 + 1) = G;
   *(rgb24 + ((height-y-1)*width + x)*3 + 2) = R; 
  }
 }
}

//平面YUV420转平面YUV422
static void YUV420p_to_YUV422p(unsigned char *yuv420[3], unsigned char *yuv422, int width, int height) 
{
 int x, y;
 //亮度信号Y复制
 int Ylen = width*height;
 memcpy(yuv422, yuv420[0], Ylen);
 //色度信号U复制
 unsigned char *pU422 = yuv422 + Ylen; //指向U的位置
 int Uwidth = width>>1; //422色度信号U宽度
 int Uheight = height>>1; //422色度信号U高度
 for (y = 0; y < Uheight; y++)
 {        
  memcpy(pU422 + y*width,          yuv420[1] + y*Uwidth, Uwidth);
  memcpy(pU422 + y*width + Uwidth, yuv420[1] + y*Uwidth, Uwidth);
 }
 //色度信号V复制
 unsigned char *pV422 = yuv422 + Ylen + (Ylen>>1); //指向V的位置
 int Vwidth = Uwidth; //422色度信号V宽度
 int Vheight = Uheight; //422色度信号U宽度
 for (y = 0; y < Vheight; y++)
 { 
  memcpy(pV422 + y*width,          yuv420[2] + y*Vwidth, Vwidth);
  memcpy(pV422 + y*width + Vwidth, yuv420[2] + y*Vwidth, Vwidth);
 }
}

//平面YUV420转RGB24
static void YUV420p_to_RGB24(unsigned char *yuv420[3], unsigned char *rgb24, int width, int height)
{
//  int begin = GetTickCount();
 int R,G,B,Y,U,V;
 int x,y;
 int nWidth = width>>1; //色度信号宽度
 for (y=0;y<height;y++)
 {
  for (x=0;x<width;x++)
  {
   Y = *(yuv420[0] + y*width + x);
   U = *(yuv420[1] + ((y>>1)*nWidth) + (x>>1));
   V = *(yuv420[2] + ((y>>1)*nWidth) + (x>>1));
   R = Y + 1.402*(V-128);
   G = Y - 0.34414*(U-128) - 0.71414*(V-128);
   B = Y + 1.772*(U-128);

//防止越界
   if (R>255)R=255;
   if (R<0)R=0;
   if (G>255)G=255;
   if (G<0)G=0;
   if (B>255)B=255;
   if (B<0)B=0;
  
   *(rgb24 + ((height-y-1)*width + x)*3) = B;
   *(rgb24 + ((height-y-1)*width + x)*3 + 1) = G;
   *(rgb24 + ((height-y-1)*width + x)*3 + 2) = R;
//    *(rgb24 + (y*width + x)*3) = B;
//    *(rgb24 + (y*width + x)*3 + 1) = G;
//    *(rgb24 + (y*width + x)*3 + 2) = R;  
  }
 }
}

YUV420、YUV422、RGB24转换相关推荐

  1. 色彩模式yuv420p与RGB24转换

    最近接手公司的新任务:实现yuv420与RGB24色彩之间的相互转换,网上有很多现成代码,但是不知道怎么验证其准确性,后来从网上找到了yuv格式的播放神器:YUV Player Deluxe,下载地址 ...

  2. 图文详解YUV420/YUV422数据格式(转)

    一.YUV格式与RGB格式的换算 以下是标准公式 RGB 转换成 YUV Y = (0.257 * R) + (0.504 * G) + (0.098 * B) + 16 Cr = V = (0.43 ...

  3. yuv420 YUV422 YUV444格式及存储排列

    YUV420: YUV422: 另外,YUV422还有YUYV,YVYU,VYUY,UYVY四种排列(格式) YUV444:

  4. 【OpenGL】用OpenGL shader实现将YUV(YUV420,YV12)转RGB-(直接调用GPU实现,纯硬件方式,效率高)...

    这段时间一直在搞视频格式的转换问题,终于最近将一个图片的YUV格式转RGB格式转换成功了.下面就来介绍一下: 由于我的工程是在vs2008中的,其中包含一些相关头文件和库,所以下面只是列出部分核心代码 ...

  5. RGB转YUV420

    转载自:http://blog.csdn.net/frankiewang008/article/details/6854616 RGB TO YUV转换原理及代码示例 RGB TO YUV转换原理及代 ...

  6. YUV / RGB 格式及快速转换算法

    1 前言 自然界的颜色千变万化,为了给颜色一个量化的衡量标准,就需要建立色彩空间模型来描述各种各样的颜色,由于人对色彩的感知是一个复杂的生理和心理联合作用 的过程,所以在不同的应用领域中为了更好更准确 ...

  7. ffmpeg 保存图片 将rgb数据_FFMPEG 实现 YUV,RGB各种图像原始数据之间的转换(swscale)...

    FFMPEG中的swscale提供了视频原始数据(YUV420,YUV422,YUV444,RGB24...)之间的转换,分辨率变换等操作,使用起来十分方便,在这里记录一下它的用法. swscale主 ...

  8. 基于 FFmpeg 的跨平台视频播放器简明教程(四):像素格式与格式转换

    系列文章目录 基于 FFmpeg 的跨平台视频播放器简明教程(一):FFMPEG + Conan 环境集成 基于 FFmpeg 的跨平台视频播放器简明教程(二):基础知识和解封装(demux) 基于 ...

  9. yuv12转rgb24 c语言,不愿孤独-技术宅也有春天

    neon优化的yuv420转rgb24汇编代码,iOS/Android可用 自己写的,目测是目前最快的 计算公式如下: 如需公式2: 则修改相关系数即可. 还可以再快一点点... //公式1: //r ...

最新文章

  1. jquery仿邮箱文本输入框自动加载邮箱后缀
  2. [技巧]如何获得某个callstack所在线程的线程号?
  3. wukong引擎源码分析之索引——part 3 文档评分 无非就是将docid对应的fields信息存储起来,为搜索结果rank评分用...
  4. 如何将git上的代码迁移到Coding上
  5. lucene源码分析(8)MergeScheduler
  6. AI:2020年6月22日北京智源大会演讲分享之11:30-12:20Jorge教授《Zero-Order Optimization Methods with Applications to RL》
  7. 笔记-高项案例题-2016年下-项目收尾
  8. 代码检查规则背景及总体介绍
  9. 如何在Kubernetes里给PostgreSQL创建secret
  10. JDK8新特性(五)之Stream流介绍和获取方式
  11. HandlerMethodArgumentResolver 参数解析器
  12. 注意sizeof()返回的数无符号数,有符号数遇到无符号数时变成无符号数
  13. OpenGL编程指南(原书第8版)环境搭建
  14. 分区助手扩大c盘后自动修复_C盘空间不足怎么办?分区助手教你如何扩大C盘
  15. scrum master_你能使我成为一个scrum master吗
  16. 知识星球,贡献C版本,OpenSSL,GMSSL,JS版本相关国密
  17. 通过hover显示子元素
  18. 第三个 1024,三年的成长与期盼!
  19. MySQL数据库入门超级详细教程
  20. 没想到吧,这就是算法工程师的一天!

热门文章

  1. Python中的魔法方法
  2. codesys raspberry pi_pi进不去的几种解决方法!
  3. 使用函数求最大公约数 pta_高中数学选修教材2-导数第6课时《函数的单调性与导数》教学设计...
  4. Qt-VS开发:解决VS中使用带有信号槽的导出对象库时,信号槽不工作的问题
  5. android手机设置时间设置,如何设置电信定制手机日期与时间
  6. docker jdk mysql_docker部署springboot前后端分离项目(jdk+jar包+mysql+redis+nginx)(示例代码)...
  7. 【LeetCode - 798】得分最高的最小轮调(转化法)
  8. 【LeetCode - 141142】环形链表(i和ii)(快慢指针,链表)
  9. 【2018icpc宁夏邀请赛现场赛】【Gym - 102222H】Fight Against Monsters(贪心排序)
  10. 【2018ACM山东省赛 - E】Sequence(树状数组,思维,优化)