如何从C ++中的YUV帧中获取一张图片

时间:2014-03-25 17:27:14

标签: c++ yuv

在C ++中我有一个

LPBYTE pYUV;

它包含YUV数据。我使用此代码将其保存到名为Original.bmp

的图像文件中
BITMAPINFOHEADER* bi = new BITMAPINFOHEADER;
    bi->biSize = sizeof(BITMAPINFOHEADER);
    bi->biWidth = pVSI->nWidth;
    bi->biHeight = pVSI->nHeight;
    bi->biPlanes = 1;
    bi->biBitCount = 24;
    bi->biCompression = 0;
    bi->biSizeImage = 0;
    bi->biXPelsPerMeter = 2835;
    bi->biYPelsPerMeter = 2835;
    bi->biClrUsed = 0;
    bi->biClrImportant = 0;
    BITMAPINFO* bmi = (BITMAPINFO*)bi;
    HDC dc = ::GetDC(NULL);
    HBITMAP bmp = CreateDIBitmap(dc, bi, CBM_INIT, pYUV, bmi, DIB_RGB_COLORS);
    ::ReleaseDC(NULL, dc);
    CBitmapEx bitmap;
    bitmap.Load(bmp);
    bitmap.Save(_T("Original.bmp"));

当我打开Original.bmp时,它看起来像这样

enter image description here

它在图像中有太多相同的图片。我如何处理LPBYTE pYUV在Original.bmp文件中制作一张图片?

ps:我可以通过此代码将其绘制到DirectX来实现此目的。

但我不知道如何将其写入图像文件

LPBYTE apDst[3] = { 0 };
    apDst[0] = (LPBYTE)pSurface; // Y
    apDst[1] = (LPBYTE)pSurface + nPitch*nH; // U
    apDst[2] = (LPBYTE)pSurface + nPitch*nH * 5 / 4; //V


    LPBYTE apSrc[3] = { 0 };
    apSrc[0] = pYUV; // Y
    apSrc[1] = pYUV + nW*nH * 5 / 4; // V
    apSrc[2] = pYUV + nW*nH; // U

    int anPch[3] = { 0 };
    anPch[0] = nW; // Y
    anPch[1] = nW / 2; // V
    anPch[2] = nW / 2; // U

    LPBYTE pDst, pSrc;
    int i, k;
    int w, h, p;






    int div[3] = { 1, 2, 2 };
    for (k = 0; k < 3; k++)
    {
        pSrc = apSrc[k];
        pDst = apDst[k];
        w = nW / div[k];        // w means the width of one row
        h = nH / div[k];        // h means the rows
        p = nPitch / div[k];

        for (i = 0; i < h; i++)
        {
            memcpy(pDst, pSrc, w);
            pDst += p;
            pSrc += anPch[k];
        }
    }

和它一样工作

enter image description here

提前致谢。

0 个答案:

没有答案