`
mintelong
  • 浏览: 396158 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

yuv420 转换成RGB565函数

阅读更多
做ADNROID CAMERA时.发现很多朋友都在找YUV RGB 转换的函数..在这里给大家共享一个.可以实际工作的代码.YUV420P ---- >> RGB565

static void ccvt_420p_rgb565(int width, int height, const unsigned char *src, __u16 *dst)
{
int line, col, linewidth;
int y, u, v, yy, vr, ug, vg, ub;
int r, g, b;
const unsigned char *py, *pu, *pv;

linewidth = width >> 1;
py = src;
pu = py + (width * height);
pv = pu + (width * height) / 4;

y = *py++;
yy = y << 8;
u = *pu - 128;
ug =   88 * u;
ub = 454 * u;
v = *pv - 128;
vg = 183 * v;
vr = 359 * v;

for (line = 0; line < height; line++) {
   for (col = 0; col < width; col++) {
    r = (yy +      vr) >> 8;
    g = (yy - ug - vg) >> 8;
    b = (yy + ub     ) >> 8;

    if (r < 0)   r = 0;
    if (r > 255) r = 255;
    if (g < 0)   g = 0;
    if (g > 255) g = 255;
    if (b < 0)   b = 0;
    if (b > 255) b = 255;
   *dst++ = (((__u16)r>>3)<<11) | (((__u16)g>>2)<<5) | (((__u16)b>>3)<<0);
  
    y = *py++;
    yy = y << 8;
    if (col & 1) {
     pu++;
     pv++;

     u = *pu - 128;
     ug =   88 * u;
     ub = 454 * u;
     v = *pv - 128;
     vg = 183 * v;
     vr = 359 * v;
    }
   } /* ..for col */
   if ((line & 1) == 0) { // even line: rewind
    pu -= linewidth;
    pv -= linewidth;
   }
} /* ..for line */
}



再给个YUV422 ---->>RGB565的..
#define YCbCrtoR(Y,Cb,Cr) (1000*Y + 1371*(Cr-128))/1000
#define YCbCrtoG(Y,Cb,Cr) (1000*Y - 336*(Cb-128) - 698*(Cr-128))/1000
#define YCbCrtoB(Y,Cb,Cr) (1000*Y + 1732*(Cb-128))/1000
#define min(x1, x2)   (((x1)<(x2))?(x1):(x2))

__u32 Conv_YCbCr_Rgb(__u8 y0, __u8 y1, __u8 cb0, __u8 cr0)
{
// bit order is
// YCbCr = [Cr0 Y1 Cb0 Y0], RGB=[R1,G1,B1,R0,G0,B0].

int r0, g0, b0, r1, g1, b1;
__u16 rgb0, rgb1;
__u32 rgb;

#if 1 // 4 frames/s @192MHz, 12MHz ; 6 frames/s @450MHz, 12MHz
r0 = YCbCrtoR(y0, cb0, cr0);
g0 = YCbCrtoG(y0, cb0, cr0);
b0 = YCbCrtoB(y0, cb0, cr0);
r1 = YCbCrtoR(y1, cb0, cr0);
g1 = YCbCrtoG(y1, cb0, cr0);
b1 = YCbCrtoB(y1, cb0, cr0);
#endif

if (r0>255 ) r0 = 255;
if (r0<0) r0 = 0;
if (g0>255 ) g0 = 255;
if (g0<0) g0 = 0;
if (b0>255 ) b0 = 255;
if (b0<0) b0 = 0;

if (r1>255 ) r1 = 255;
if (r1<0) r1 = 0;
if (g1>255 ) g1 = 255;
if (g1<0) g1 = 0;
if (b1>255 ) b1 = 255;
if (b1<0) b1 = 0;

// 5:6:5 16bit format
rgb0 = (((__u16)r0>>3)<<11) | (((__u16)g0>>2)<<5) | (((__u16)b0>>3)<<0); //RGB565.
rgb1 = (((__u16)r1>>3)<<11) | (((__u16)g1>>2)<<5) | (((__u16)b1>>3)<<0); //RGB565.

rgb = (rgb1<<16) | rgb0;

return(rgb);
}
分享到:
评论

相关推荐

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

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

    YUV420转化为RGB图像输出

    接着,调用`yuv420_to_rgb`函数进行转换,并显示转换后的RGB图像。需要注意的是,OpenCV的`imread`函数在读取YUV420文件时可能需要特定的标志来正确处理数据,具体取决于文件格式。 此外,优化也是关键。对于大规模...

    yuv420转rgb565

    这个方法首先调用`decodeYUV420SPToRGB565`函数将YUV420格式的数据转换为RGB565格式,并将结果保存在一个整型数组中。然后创建一个`Bitmap`对象,并使用`Bitmap.createBitmap`方法将整型数组中的数据转换为位图。...

    YUV420与RGB24转换

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

    YUV420转换成RGB

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

    YUV420转RGB24函数

    本文将详细介绍一种用于将YUV420格式数据转换为RGB24格式的函数——“YUV420转RGB24函数”。该函数不仅适用于多种平台,而且具有良好的跨平台特性。 #### 二、YUV与RGB简介 在深入探讨转换函数之前,我们首先需要...

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

    2. **色彩空间转换**:对于每一个像素,我们需要使用以下公式将YUV转换为RGB: ``` R = Y + 1.402 * (V - 128) G = Y - 0.34414 * (U - 128) - 0.71414 * (V - 128) B = Y + 1.772 * (U - 128) ``` 这些系数是...

    RGB24与YUV420格式相互转换

    它们包含了将YUV420数据转换为RGB24,以及反之的函数实现。在实际应用中,这些源代码可以被集成到视频编解码器中,用于处理输入和输出的视频帧。 总的来说,理解和掌握RGB24与YUV420之间的转换是进行高效视频处理和...

    rgb转yuv420源代码(C语言)

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

    YUV420P转RGB32以及旋转处理

    例如,可能有一个名为`YUV420PToRGB32`的函数,用于完成YUV420P到RGB32的转换;另一个如`RotateImage`的函数,用于执行图像旋转。这些源代码会包含具体的数学运算和内存管理细节,帮助理解实际的实现过程。 总的来...

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

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

    RGB888转NV21(yuv420sp)源代码详解

    在RGB888到NV21的转换过程中,首先需要将RGB像素数据转换为YUV格式。转换公式如下: - Y = 0.299R + 0.587G + 0.114B - U = -0.169R - 0.331G + 0.5B + 128 - V = 0.5R - 0.419G - 0.081B + 128 这里的R、G、B分别...

    RGB2YUV.rar_bmp yuv_mmx_rgb yuv420_rgb2yuv_rgb2yuv mmx

    其中,“yuv_mmx_rgb”指的是使用MMX实现的YUV与RGB之间的转换,“yuv420_rgb2yuv”表示YUV420格式的转换,而“rgb2yuv_mmx”则是MMX优化的RGB到YUV转换函数。 描述中提到,这个程序通过MMX指令集实现了宽位处理,...

    YUV420到RGB888的转换类

    2. **颜色空间转换**:将YUV转换为RGB。转换公式通常为: ``` R = Y + 1.402 * (V - 128) G = Y - 0.344 * (U - 128) - 0.714 * (V - 128) B = Y + 1.772 * (U - 128) ``` 其中,Y、U、V都在0-255范围内,R、G...

    linux_c语言_YUV420转RGB888源码

    3. **YUV420到RGB888转换**:转换过程涉及到从YUV采样模式(4:2:0)的半分辨率色度分量(U和V)恢复到每个像素的完整RGB值。这个过程通常涉及插值算法,例如最近邻插值、双线性插值或更高级的滤波技术,以提高色度...

    OPENCV读取YUV420格式

    我们可以使用公式手动转换,或者使用预处理函数,如`yuv420spToRgb`,该函数会根据YUV420的布局计算每个像素的RGB值。 4. **创建Mat对象**:OpenCV的`Mat`类是图像处理的核心,它用于表示图像数据。将转换后的RGB...

    python实现yuv转RGB图片程序

    为了实现这个转换,你需要创建一个函数,接受YUV图像数据,然后使用上述公式计算出对应的RGB值。这可以通过遍历YUV数组的每个元素并执行转换来完成。最后,你可以使用PIL或numpy的保存函数将结果写入新的RGB图像文件...

    Unity3D播放YUV420视频脚本

    为了正确显示YUV数据,你可能需要编写一个自定义Shader,处理纹理采样以适应YUV到RGB的转换。 5. **渲染**:使用Unity的Graphics.Blit函数,将纹理绘制到屏幕上的一个渲染目标,如Camera的rendertexture。你还可以...

    C#中关于视频YUV格式与RGB24格式之间的相互转换

    4. RGB2YUV转换函数:该函数负责将RGB格式的数据转换为YUV格式的数据。这个转换过程涉及到特定的转换公式,它们基于人眼对色彩的感知特点来对图像数据进行压缩,同时保证图像质量不会损失太多。 5. YUV422Packed...

    YUV-RGB.rar_RGB YUV_RGB YUV_RGB-gt;YUV_yuv to rgb_yuvrgb转换dsp

    5. **yuvrgb转换**:这可能指的是一个特定的函数或库,用于执行YUV到RGB的转换。 压缩包中的文件"YUV-RGB"可能是实现这一转换的源代码、样本数据或转换工具,供开发者或研究人员使用。 综上所述,了解YUV到RGB的...

Global site tag (gtag.js) - Google Analytics