精易论坛

标题: 求个算法 yuv420p 转rgb 不要浮点算法c# c++ go什么语言都可以 [打印本页]

作者: 1666160975    时间: 2023-10-22 13:01
标题: 求个算法 yuv420p 转rgb 不要浮点算法c# c++ go什么语言都可以
求个算法 yuv420p 转rgb 不要浮点算法c# c++ go什么语言都可以

补充内容 (2023-10-22 13:04):
不要汇编语言 rust语言 冷门的看不懂0.0~~~~
作者: 江琦不简单    时间: 2023-10-22 13:43
这个参数,里面包含了浏览器的信息。按理说可以固定,扣起来有点费劲
作者: 星星之夜    时间: 2023-10-22 13:57
还不要浮点算法,带浮点都不行么·
作者: 星星之夜    时间: 2023-10-22 13:57
那就只给思路了
要将YUV420P转换为RGB,可以按照以下步骤进行:

对每个像素点,获取其对应的Y、U和V值。

根据下面的公式计算R、G和B的值:

R = Y + 1.402 * (V - 128)
G = Y - 0.344136 * (U - 128) - 0.714136 * (V - 128)
B = Y + 1.772 * (U - 128)

其中,Y、U和V的取值范围为[0, 255],通常需要减去128来进行归一化。

确保计算得到的R、G和B值都在[0, 255]的范围内。如果某个值小于0,则将其置为0;如果某个值大于255,则将其置为255。

这样,你就可以将YUV420P格式的像素转换为RGB值了。
作者: 1666160975    时间: 2023-10-22 13:57
星星之夜 发表于 2023-10-22 13:57
还不要浮点算法,带浮点都不行么·

效率太差
作者: 学而容易    时间: 2023-10-24 10:45
Y = 0.299R + 0.587G + 0.114*B
U = -0.147R - 0.289G + 0.436*B
V = 0.615R - 0.515G - 0.100*B

作者: 星星之夜    时间: 2023-10-24 16:10
1666160975 发表于 2023-10-22 13:57
效率太差

using System;

public class YuvToRgbConverter
{
    public static void Convert(byte[] yuvData, byte[] rgbData, int width, int height)
    {
        int frameSize = width * height;
        int uvOffset = frameSize;

        for (int y = 0; y < height; y++)
        {
            int yIndex = y * width;
            int uvIndex = uvOffset + (y / 2) * width;

            for (int x = 0; x < width; x++)
            {
                int yValue = yuvData[yIndex + x];
                int uValue = yuvData[uvIndex + (x / 2) * 2];
                int vValue = yuvData[uvIndex + (x / 2) * 2 + 1];

                int c = yValue - 16;
                int d = uValue - 128;
                int e = vValue - 128;

                int r = (298 * c + 409 * e + 128) >> 8;
                int g = (298 * c - 100 * d - 208 * e + 128) >> 8;
                int b = (298 * c + 516 * d + 128) >> 8;

                rgbData[yIndex * 3 + x * 3] = Clamp(r);
                rgbData[yIndex * 3 + x * 3 + 1] = Clamp(g);
                rgbData[yIndex * 3 + x * 3 + 2] = Clamp(b);
            }
        }
    }

    private static byte Clamp(int value)
    {
        return (byte)(value < 0 ? 0 : (value > 255 ? 255 : value));
    }
}




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4