Оптимизация преобразования формата изображения RGB в Unity c # - PullRequest
0 голосов
/ 26 марта 2019

Для оптимизации при преобразовании формата изображения 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;
...