#region ******************彩色图像记录的格式,YUV 转 RGB******************
/* YUV, http://zh.wikipedia.org/wiki/YUV#.E5.B8.B8.E7.94.A8.E7.9A.84YUV.E6.A0.BC.E5.BC.8F
* 作为视频媒体类型的辅助说明类型(Subtype),它们对应的GUID如下:
* 在DirectShow中,常见的RGB和YUV格式
GUID 格式描述
MEDIASUBTYPE_RGB1 2色,每个像素用1位表示,需要调色板
MEDIASUBTYPE_RGB4 16色,每个像素用4位表示,需要调色板
MEDIASUBTYPE_RGB8 256色,每个像素用8位表示,需要调色板
MEDIASUBTYPE_RGB565 每个像素用16位表示,RGB分量分别使用5位、6位、5位
MEDIASUBTYPE_RGB555 每个像素用16位表示,RGB分量都使用5位(剩下的1位不用)
MEDIASUBTYPE_RGB24 每个像素用24位表示,RGB分量各使用8位
MEDIASUBTYPE_RGB32 每个像素用32位表示,RGB分量各使用8位(剩下的8位不用)
MEDIASUBTYPE_ARGB32 每个像素用32位表示,RGB分量各使用8位(剩下的8位用于表示Alpha通道值)
*
MEDIASUBTYPE_YUY2 YUY2格式,以4:2:2方式打包
MEDIASUBTYPE_YUYV YUYV格式(实际格式与YUY2相同)
MEDIASUBTYPE_YVYU YVYU格式,以4:2:2方式打包
MEDIASUBTYPE_UYVY UYVY格式,以4:2:2方式打包
MEDIASUBTYPE_AYUV 带Alpha通道的4:4:4 YUV格式
MEDIASUBTYPE_Y41P Y41P格式,以4:1:1方式打包
MEDIASUBTYPE_Y411 Y411格式(实际格式与Y41P相同)
MEDIASUBTYPE_Y211 Y211格式
MEDIASUBTYPE_IF09 IF09格式
MEDIASUBTYPE_IYUV IYUV格式
MEDIASUBTYPE_YV12 YV12格式
MEDIASUBTYPE_YVU9 YVU9格式
*/
#region RGB TO RGB32
/* RGB32 */
/// <summary>
/// 根据指针地址及内存块长度,获取RGB32数组
/// @20140516
/// </summary>
/// <param name="pBuffer"></param>
/// <param name="lBufferSize"></param>
/// <param name="lPicWidth"></param>
/// <param name="lPicHeight"></param>
/// <returns></returns>
public static byte[] GetRgb32_FromIntptr(IntPtr pBuffer, Int32 lBufferSize, Int32 lPicWidth, Int32 lPicHeight)
{
// 设置数组大小
byte[] rgba32 = new byte[lPicHeight * lPicWidth * 4];
Marshal.Copy(pBuffer, rgba32, 0, lBufferSize);
return rgba32;
}
#endregion
#region YUV TO RGB32
/// <summary>
/// YUV 转 RGB32
/// </summary>
/// <param name="pYPlaneByte"></param>
/// <param name="pVPlaneByte"></param>
/// <param name="pUPlaneByte"></param>
/// <param name="lPicHeight"></param>
/// <param name="lPicWidth"></param>
/// <param name="bError">是否存在错误</param>
/// <param name="strErrorDesc">错误消息</param>
/// <returns></returns>
public static byte[] GetRgb32_From_Yuv(byte[] pYPlaneByte, byte[] pUPlaneByte, byte[] pVPlaneByte, Int32 lPicHeight, Int32 lPicWidth, ref bool bError, ref string strErrorDesc)
{
bError = true;
strErrorDesc = "无错误";
int picSize = lPicWidth * lPicHeight;
byte[] pRrgaByte = new byte[picSize * 4];
int A = 0;
try
{
for (int iRow = 0; iRow < lPicHeight; iRow++)
{
for (int jCol = 0; jCol < lPicWidth; jCol++)
{
//int Y = pYPlane[i * dwWidth + j];
//int U = pUPlane[(i / 2) * (dwWidth / 2) + (j / 2)];
//int V = pVPlane[(i / 2) * (dwWidth / 2) + (j / 2)];
//int R = Y + (U - 128) + (((U - 128) * 103) >> 8);
//int G = Y - (((V - 128) * 88) >> 8) - (((U - 128) * 183) >> 8);
//int B = Y + (V - 128) + (((V - 128) * 198) >> 8);
//R = max(0, min(255, R));
//G = max(0, min(255, G));
//B = max(0, min(255, B));
int Y = pYPlaneByte[iRow * lPicWidth + jCol];
int U = pUPlaneByte[(iRow / 2) * (lPicWidth / 2) + (jCol / 2)];
int V = pVPlaneByte[(iRow / 2) * (lPicWidth / 2) + (jCol / 2)];
/* 存在颜色转换错误问题。现象&
YUV转RGB汇总
最新推荐文章于 2022-04-03 17:47:31 发布
本文档详细介绍了YUV格式的多种变种,并提供了从YUV到RGB32的转换代码实现,包括YUY2、YV12、UYVY等格式,解决了颜色转换中的错误问题。
摘要由CSDN通过智能技术生成