Unity C#中的图像格式转换优化RGB

时间:2019-03-26 07:16:40

标签: c# image unity3d rgb

在YUV420SP图像格式转换为RGB格式期间进行优化。

我正在考虑。

返回值是一个彩色数组,每个RGB的值都在0到255之间。

这是我的完整源代码

Color[] YUV420SPtoRGB(byte[] yuv420sp, int width, int height)
{
    int frameSize = width * height;
    int[] rgb = new int[frameSize];
    Color32 color = new Color32();  
    Color[] colors = new Color[width * height];

    for (int j = 0, yp = 0; j < height; j++)
    {
        int uvp = frameSize + (j >> 1) * width, u = 0, v = 0;
        for (int i = 0; i < width; i++, yp++)
        {

            int y = (0xff & ((int)yuv420sp[yp])) - 16;
            if (y < 0) y = 0;
            if ((i & 1) == 0)
            {
                v = (0xff & yuv420sp[uvp++]) - 128;
                u = (0xff & yuv420sp[uvp++]) - 128;
            }

            int y1192 = 1192 * y;
            int r = (y1192 + 1634 * v);
            int g = (y1192 - 833 * v - 400 * u);
            int b = (y1192 + 2066 * u);

            if (r < 0) r = 0; else if (r > 262143) r = 262143;
            if (g < 0) g = 0; else if (g > 262143) g = 262143;
            if (b < 0) b = 0; else if (b > 262143) b = 262143;

            rgb[yp] = (int)(0xff000000 | ((r << 6) & 0xff0000) | ((g >> 2) & 0xff00) | ((b >> 10) & 0xff));

            color.r = (byte)((rgb[yp] >> 16));
            color.g = (byte)((rgb[yp] >> 8));
            color.b = (byte)(rgb[yp]);

            colors[yp] = color;

        }
    }
    return colors;
}

当前,在进行RGB计算之后,将该值放入int数组中。

int r = (y1192 + 1634 * v);
int g = (y1192 - 833 * v - 400 * u);
int b = (y1192 + 2066 * u);


rgb[yp] = (int)(0xff000000 | ((r << 6) & 0xff0000) | ((g >> 2) & 0xff00) | ((b >> 10) & 0xff));

它将值从0除以255得到值。

color.r = (byte)((rgb[yp] >> 16));
color.g = (byte)((rgb[yp] >> 8));
color.b = (byte)(rgb[yp]);

colors[yp] = color;

如果我跳过这一部分,我认为我可以对其进行优化。我该怎么办?

rgb[yp] = (int)(0xff000000 | ((r << 6) & 0xff0000) | ((g >> 2) & 0xff00) | ((b >> 10) & 0xff));

更新1.现在

if (r < 0) r = 0; else if (r > 262143) r = 262143;
if (g < 0) g = 0; else if (g > 262143) g = 262143;
if (b < 0) b = 0; else if (b > 262143) b = 262143;

color.r = (byte)(((r << 6) & 0xff0000) >> 16);
color.g = (byte)(((g >> 2) & 0xff00) >> 8);
color.b = (byte)((b >> 10) & 0xff);

colors[yp] = color;

0 个答案:

没有答案