`
xpp02
  • 浏览: 1071112 次
社区版块
存档分类
最新评论

YUV420、YUV422、RGB24转换

 
阅读更多

//平面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;
}
}
}

分享到:
评论

相关推荐

    GRAY8、YUV420P、YUV422P、YUV444P、YUYV422、RGB24间任意两个互转

    标题提到的"GRAY8、YUV420P、YUV422P、YUV444P、YUYV422、RGB24间任意两个互转"涵盖了常见的几种颜色格式之间的转换。以下将详细介绍这些格式以及如何进行转换。 1. GRAY8(灰度图像):这种格式仅包含单一的亮度...

    YUV420转YUV422

    在实际应用中,YUV420到YUV422的转换可能用于适应不同的硬件接口要求,比如某些显示设备或编码器可能只支持422格式。此外,转换也可能在图像处理任务中,如缩放、滤波或色彩空间转换中发生。 总之,YUV420到YUV422...

    YUV420与RGB24转换

    例如,`ConvertYUV2RGB`函数可能会接受一个YUV420的图像缓冲区和目标RGB24的缓冲区,然后执行上述的转换操作。 总之,YUV420和RGB24之间的转换涉及到颜色空间的变换和分辨率调整,这对于视频处理和图像显示至关重要...

    YUV转换显示编辑工具YUV420.YUV422

    "YUV转换显示编辑工具YUV420.YUV422"显然是一款专门针对这种颜色格式的软件工具,用于转换、显示和编辑YUV格式的视频数据。 YUV色彩空间不同于我们常见的RGB(红绿蓝)模型,它将图像分为三个分量:Y(亮度)和两个...

    C/C++源码,图像RGB转换为YUV420sp和YUV420sp格式转换为YUV422

    C/C++ 源码,图像RGB格式转换为YUV420格式和图像YUV420sp格式转换为YUV422,亲测有效,已经得到验证过

    YUV420转化为RGB图像输出

    在计算机视觉和图像处理领域,颜色空间转换是一个重要的任务,其中YUV420到RGB的转换尤为常见。YUV420是一种广泛用于视频编码的色彩空间,它通过将图像数据分为亮度(Y)和两个色度分量(U和V)来节省存储和带宽。而...

    RGB24与YUV420格式相互转换

    `yuv2rgb.c` 和 `yuvrgb24.c` 文件很可能是实现这些转换的C语言源代码。它们包含了将YUV420数据转换为RGB24,以及反之的函数实现。在实际应用中,这些源代码可以被集成到视频编解码器中,用于处理输入和输出的视频帧...

    YUV422到RGB24的格式转化

    YUV422 到 RGB24 格式转换算法 在图像处理和显示领域中, YUV422 是一种常见的图像格式,它的特点是每个像素点由两个字节表示,其中一个字节表示 Y 分量,另一个字节表示 UV 分量交叉存储。然而,在 LCD 显示器上,...

    Unity 工具之 YUV 使用 Shader 转为 RGB 显示封装 YUV420ToRGBWrapper

    Unity 工具之 YUV(YUV420 :I420,YV12,NV12,NV21)使用 shader 转为 RGB 显示 封装 YUV420ToRGBWrapper 1、首先根据 YUV 对应格式的 YUV 的排列方式,拆分 YUV; 2、然后,在通过 YUV 与 RGB 转换对应公式,进行...

    Yuv2rgb.tar.gz_YUV422 RGB_filter yuv422 yuv420_yuv2rgb linux_yuv

    "yuv422__rgb888"和"yuv422_to_rgb_24"标签明确了这个工具或代码是处理从YUV422到RGB888(即RGB24)的转换。RGB888是另一种表示24位颜色的方式,这里的每个颜色通道(红、绿、蓝)都用8位表示。 文件列表中的"yuv2...

    yuv420p转rgb rgb转yuv42p yuv420p转gray实现

    yuv420p转rgb rgb转yuv42p yuv420p转gray实现

    YUV420图像数据转换成RGB888和RGB565位图文件

    将YUV420图像数据转换成RGB888和RGB565位图文件;包含YUV420解码算法;YUV数据到RGB数据的转换算法;生成RGB888位图和RGB565位图的BITMAP文件格式算法;相关算法与函数都有详细的注释信息。

    RGB32转换yuv420方法

    RGB32到YUV420的转换是图像处理领域中的常见操作,主要涉及到颜色空间的变换。在数字视频和图像编码中,YUV色彩空间因其对存储和传输的高效性而被广泛应用,尤其是在移动设备和网络视频流中。RGB32是一种常见的RGB...

    rgb24转yuv420高效率 完整代码,C++实现

    RGB24到YUV420的转换是图像处理领域中的常见操作,特别是在视频编码和解码中。这种转换涉及到将RGB色彩空间的数据转换为YUV色彩空间,以节省存储空间和提高编码效率。在C++中实现这个过程,我们可以从以下几个方面来...

    rgb转yuv420源代码(C语言)

    RGB到YUV420的转换是图像处理领域常见的颜色空间转换操作,广泛应用于视频编码、解码以及图像处理系统中。在C语言中实现这个转换涉及到对像素数据的逐个处理,通常包括数学计算和内存操作。下面将详细介绍这个过程。...

    yuv420sp(NV21)转RGB的核心代码以及多线程

    本话题将深入探讨如何将YUV420sp转换为RGB,并涉及多线程优化。 首先,我们来理解YUV420sp格式。它由Y(亮度)、U(蓝色色度)和V(红色色度)三个分量组成。Y分量是全分辨率的,而U和V分量则是以半分辨率存储的,...

    YUV420转换成RGB

    ### YUV420到RGB的转换:OpenCV实现 #### 一、基础知识介绍 **YUV**是一种常用于视频编码的颜色模型,其中Y代表亮度(Luminance),U和V是色差信号(Chrominance)。在数字图像处理领域,YUV色彩空间有着广泛的...

    字符叠加及YUV420转RGB

    字符叠加通常用于在视频或图像上添加文本信息,如时间戳、水印或者标题,而YUV420到RGB的颜色空间转换则是图像显示和处理的基础步骤,因为不同的设备和系统可能采用不同的颜色表示方式。下面将详细阐述这两个知识点...

Global site tag (gtag.js) - Google Analytics