首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c#将YUV 4:2:2转换为RGB?

c#将YUV 4:2:2转换为RGB?
EN

Stack Overflow用户
提问于 2011-08-06 00:07:30
回答 3查看 12.1K关注 0票数 2

我有一个屏幕采集卡,给我一个YUV4:2:2格式的图像。

我需要把我的byte[]转换成RGB格式吗?

请帮帮忙,杰森

EN

回答 3

Stack Overflow用户

发布于 2011-08-06 00:24:04

你可以使用this library从RGB,YUV,HSB,HSL和许多其他颜色格式进行转换,例如在RGB类中使用静态方法来从YUV转换,只需调用

代码语言:javascript
复制
RGB rgb = RBB.YUVtoRBG(y, u, v);

以及它的底层实现:

代码语言:javascript
复制
public static RGB YUVtoRGB(double y, double u, double v)
{
    RGB rgb = new RGB();

    rgb.Red = Convert.ToInt32((y + 1.139837398373983740*v)*255);
    rgb.Green = Convert.ToInt32((
        y - 0.3946517043589703515*u - 0.5805986066674976801*v)*255);
    rgb.Blue = Convert.ToInt32((y + 2.032110091743119266*u)*255);

    return rgb;
}
票数 2
EN

Stack Overflow用户

发布于 2012-07-02 07:11:18

使用仅整数计算的解决方案(即,应该比浮点/双精度计算更快)是:

代码语言:javascript
复制
    static byte asByte(int value)
    {
        //return (byte)value;
        if (value > 255)
            return 255;
        else if (value < 0)
            return 0;
        else
            return (byte)value;
    }

    static unsafe void PixelYUV2RGB(byte * rgb, byte y, byte u, byte v)
    {
        int C = y - 16;
        int D = u - 128;
        int E = v - 128;

        rgb[2] = asByte((298 * C + 409 * E + 128) >> 8);
        rgb[1] = asByte((298 * C - 100 * D - 208 * E + 128) >> 8);
        rgb[0] = asByte((298 * C + 516 * D + 128) >> 8);
    }

这里使用PixelYUV2RGB函数来填充rgb字节数组中的值。

这比上面的要快得多,但在c#中的全高清图像的性能方面仍然低于平均水平。

请注意,这仅适用于YUV到RGB。YUV 422与每对UV (颜色)值的2个Y(亮度)值一起存储。因此,您将使用每一对的相同u,v值调用函数。下面的评论中提到了这一点的来源。

票数 0
EN

Stack Overflow用户

发布于 2014-01-31 13:10:59

有代码here可以做你想做的事情,但是RGB位图的字节顺序是颠倒的(交换红色和蓝色)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6959275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档