最近项目是用到了RGB格式转YUV420格式,写了一个接口:

enum NV_Mode
{NV_NONE = 0,NV12_MODE = 1,NV21_MODE = 2
};struct RGB2YUV420Info
{unsigned char *pYUV420;unsigned char *pRGB;NV_Mode eMode;int width;int height;RGB2YUV420Info(){pYUV420 = nullptr;pRGB = nullptr;eMode = NV_NONE;width = 0;height = 0;}
};void RGBToYUV420(RGB2YUV420Info &stInfo)
{if (!(stInfo.pYUV420) || !(stInfo.pRGB)){return;}int frameSize = stInfo.width * stInfo.height;int yIndex = 0;int uvIndex = frameSize;int R = 0, G = 0, B = 0, Y = 0, U = 0, V = 0;for (int i = 0; i < stInfo.height; ++i){for (int j = 0; j < stInfo.width; ++j){B = stInfo.pRGB[(i * stInfo.width + j) * 3 + 0];G = stInfo.pRGB[(i * stInfo.width + j) * 3 + 1];R = stInfo.pRGB[(i * stInfo.width + j) * 3 + 2];// RGB to YUVY = ((66 * R + 129 * G + 25 * B + 128) >> 8) + 16;U = ((-38 * R - 74 * G + 112 * B + 128) >> 8) + 128;V = ((112 * R - 94 * G - 18 * B + 128) >> 8) + 128;stInfo.pYUV420[yIndex++] = (unsigned char)((Y < 0) ? 0 : ((Y > 255) ? 255 : Y));// NV12  YYYYYYYY UVUV// NV21  YYYYYYYY VUVU// 偶数判断// if ((0 == (i % 2)) && (0 == (j % 2)))if (!(i & 1) && !(j & 1)){if (NV12_MODE == stInfo.eMode){stInfo.pYUV420[uvIndex++] = (unsigned char)((U < 0) ? 0 : ((U > 255) ? 255 : U));stInfo.pYUV420[uvIndex++] = (unsigned char)((V < 0) ? 0 : ((V > 255) ? 255 : V));}else if (NV21_MODE == stInfo.eMode){stInfo.pYUV420[uvIndex++] = (unsigned char)((V < 0) ? 0 : ((V > 255) ? 255 : V));stInfo.pYUV420[uvIndex++] = (unsigned char)((U < 0) ? 0 : ((U > 255) ? 255 : U));}else{// TODO 不支持的类型}}}}return;
}

RGB转YUV420,支持NV12(420p)和NV21(420sp)相关推荐

  1. YUV图解 (YUV444, YUV422, YUV420, YV12, NV12, NV21)

    YUV格式有两大类:planar和packed. 对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V. 对于packed的YUV格式,每个像素点的Y ...

  2. YUV图解 (YUV444, YUV422, YUV420, YV12, NV12, NV21)

    如果你认为本系列文章对你有所帮助,请大家有钱的捧个钱场,点击此处赞助,赞助额1元起步,多少随意 锋影 email:174176320@qq.com YUV图解 (YUV444, YUV422, YUV ...

  3. YUV图解 (YUV444, YUV422, YUV420, YV12, NV12, NV21)-- 转

    YUV图解 (YUV444, YUV422, YUV420, YV12, NV12, NV21)

  4. RGB、YUV420、NV21、I420编码区别

    一.RGB与YUV 首先了解视频编码为什么使用YUV420而不是rgb.那么需要了解两者的原理,看图说话 所以从内存的角度来说,yuv单位像素使用的内存更低,但是两者表示的效果是一致的,也可以认为rg ...

  5. yuv420格式nv12,nv21,I420,YV12互转

    YUV格式有两大类:planar和packed. 对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V. 对于packed的YUV格式,每个像素点的Y ...

  6. yuv图解(YUV444,YUV422,YUV420,YV12,NV12,NV21)

    参考文章 图解YUV YUV是什么 YUV(444,422,420) And YUV(Packed,Planar,Semi-Planar) 知识点 YUV是用一个称为Y(相当于灰度)的亮度分量和两个色 ...

  7. RGB转YUV420

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

  8. rgb sw 线主板接口在哪_自带RGB风扇,支持神光同步的九州风神小堡垒120I水冷散热器...

    相比于R5 2400G平台直接搭配原装风扇凑合用,作为游戏主力机的i7-8700平台还是搭配好一点的散热器,不管是水冷还是风冷,只要能够稳压8700.相比于立柱式的风冷散热器,水冷散热器的优势就是不用 ...

  9. YV12toI420 yuv420、NV12、YV12相互转换

    在录像时设置了YV12要保存图片时 YUV420P.I420.NV12.YV12格式转NV12保存图片 GLSurfaceView implements SurfaceHolder.Callback, ...

最新文章

  1. 在华为路由器上配置IPv6 over IPv4隧道
  2. 磨刀不误砍柴工——数据准备的过程与实践
  3. tensolrflow之基础变量
  4. 牛客 - 张老师的旅行(dp)
  5. 【JavaScript】出现即使设置了ID也获取不到的可能原因与window.onload
  6. Postman status: 415_415亩!白云首宗农村土地规模化流转成功签约
  7. android m在哪下载地址,android m预览版SDK下载地址 android m预览版SDK下载网址
  8. [读书笔记] - 《深度探索C++对象模型》第1章 关于对象
  9. 指向 类成员函数 指针的用法
  10. 解决跨浏览器兼容的CSS编码准则
  11. phpstorm使用技巧
  12. 使用GitHub管理代码
  13. linux 各文件夹的作用
  14. 如何选择jquery版本
  15. 计算机语言中索引什么意思,index在中是什么意思
  16. 服务器主机如何安装系统,服务器主机系统安装教程
  17. 网易微专业 UI设计师
  18. “身体质量指数BMI”实例详解
  19. 考研数一英语二计算机,考研常识 | 我是考英语一还是英语二?数一二三都有什么区别...
  20. GaN制备micro-led(一)

热门文章

  1. USB 输入,集成OVP过压保护锂电池充电芯片产品-19号电路板
  2. ESP32-CAM、ESP8266、WIFI、蓝牙、单片机、热点创建嵌入式DNS服务器
  3. uniapp简单搞定支付
  4. 关于CORBA实现的介绍
  5. throw 和 throws 的区别
  6. C语言中excit函数,2010年12月英语四级全真预测试卷及答案解析(4)
  7. F分布概率密度函数的推导
  8. Java项目专栏之数据库建表
  9. “区块链技术创新要植根市场”
  10. php7.4新特性 多线程,PHP7新特性WhatwillbeinPHP7/PHPNG