关于图像处理:YUVyuv422yuv420pyuv420sp-convert-to-RGB

2次阅读

共计 2192 个字符,预计需要花费 6 分钟才能阅读完成。

    void convert_yuv420p_to_rgb_buffer(unsigned char* yuv, unsigned char* rgb, unsigned int width, unsigned int height)
    {
        int y, u, v;
        int r, g, b;
        unsigned char* rgbPixel = rgb;
        unsigned char* yuvPixel = yuv;
        unsigned char* uHeader = yuv + width * height;
        unsigned char* vHeader = yuv + width * height + (width * height) / 4;
        int half_width = width / 2;

        for (int j = 0; j < height; j++) {for (int i = 0; i < width; i++) {

                y = *yuvPixel;
                yuvPixel++;
                u = *(uHeader + (i / 2 + (j / 2 * half_width))); 
                v = *(vHeader + (i / 2 + (j / 2 * half_width)));

                // yuv to rgb, 整数、移位,缩小计算量
                r = y + ((360 * (v - 128)) >> 8);
                r = r > 255 ? 255 : (r < 0 ? 0 : r);
                *rgbPixel = r;
                rgbPixel++;

                g = y - (((88 * (u - 128) + 184 * (v - 128))) >> 8);
                g = g > 255 ? 255 : (g < 0 ? 0 : g);
                *rgbPixel = g;
                rgbPixel++;

                b = y + ((455 * (u - 128)) >> 8);
                b = b > 255 ? 255 : (b < 0 ? 0 : b);
                *rgbPixel = b;
                rgbPixel++;
            }
        }
    }
    void convert_yuv420sp_to_rgb_buffer(unsigned char* yuv, unsigned char* rgb, unsigned int width, unsigned int height)
    {
        int y, u, v;
        int r, g, b;
        unsigned char* rgbPixel = rgb;
        unsigned char* yuvPixel = yuv;
        unsigned char* uHeader = yuv + width * height;
        //unsigned char* vHeader = yuv + width * height + (width * height) / 4;
        int half_width = width / 2;

        for (int j = 0; j < height; j++) {for (int i = 0; i < width; i++) {

                y = *yuvPixel;
                yuvPixel++;
                u = *(uHeader + (i / 2 + (j / 2 * half_width)) * 2);  // 留神:因为是整数乘除,这里 (i / 2 * 2) 不肯定都等于 i, 不要简化。v = *(uHeader + (i / 2 + (j / 2 * half_width)) * 2+1);

                // yuv to rgb, 整数、移位,缩小计算量
                r = y + ((360 * (v - 128)) >> 8);
                r = r > 255 ? 255 : (r < 0 ? 0 : r);
                *rgbPixel = r;
                rgbPixel++;

                g = y - (((88 * (u - 128) + 184 * (v - 128))) >> 8);
                g = g > 255 ? 255 : (g < 0 ? 0 : g);
                *rgbPixel = g;
                rgbPixel++;

                b = y + ((455 * (u - 128)) >> 8);
                b = b > 255 ? 255 : (b < 0 ? 0 : b);
                *rgbPixel = b;
                rgbPixel++;
            }
        }
    }
    void convert_yuyv_to_rgb_buffer(unsigned char* yuv, unsigned char* rgb, unsigned int width, unsigned int height)
    {
        unsigned int i;
        unsigned char* rgbPixel = rgb;
        unsigned char* yuvPixel = yuv;

        int y0, u, y1, v;
        int r, g, b;
        for (i = 0; i < width * height / 2; i++) {

            y0 = *yuvPixel;
            yuvPixel++;
            u = *yuvPixel;
            yuvPixel++;
            y1 = *yuvPixel;
            yuvPixel++;
            v = *yuvPixel;
            yuvPixel++;

            // yuv to rgb, 整数、移位,缩小计算量
            r = y0 + ((360 * (v - 128)) >> 8);
            r = r > 255 ? 255 : (r < 0 ? 0 : r);
            *rgbPixel = r;
            rgbPixel++;

            g = y0 - (((88 * (u - 128) + 184 * (v - 128))) >> 8);
            g = g > 255 ? 255 : (g < 0 ? 0 : g);
            *rgbPixel = g;
            rgbPixel++;

            b = y0 + ((455 * (u - 128)) >> 8);
            b = b > 255 ? 255 : (b < 0 ? 0 : b);
            *rgbPixel = b;
            rgbPixel++;


            // yuv to rgb, 整数、移位,缩小计算量
            r = y1 + ((360 * (v - 128)) >> 8);
            r = r > 255 ? 255 : (r < 0 ? 0 : r);
            *rgbPixel = r;
            rgbPixel++;

            g = y1 - (((88 * (u - 128) + 184 * (v - 128))) >> 8);
            g = g > 255 ? 255 : (g < 0 ? 0 : g);
            *rgbPixel = g;
            rgbPixel++;

            b = y1 + ((455 * (u - 128)) >> 8);
            b = b > 255 ? 255 : (b < 0 ? 0 : b);
            *rgbPixel = b;
            rgbPixel++;
        }
    }
正文完
 0