StretchDIBits绘制原始YUV异常

StretchDIBits绘制原始YUV图片,图片的大小是1366 * 768,界面出现花屏倾斜。 1、解决方法,将原始YUV格式大小,进行YUV缩放,达到StretchDIBits可正常绘制的分辨率,比如:1920*1280等等。

//GDI绘制YUV格式的原始数据
void GDIDrawYUV(uint8_t* data, int w, int h)
{
    static const int dw = 1280;
    static const int dh = 1080;

    unsigned char * dstyuv = new unsigned char[dw * dh * 3 / 2];

    //libyuv进行YUV数据大小转换
    libyuv::I420Scale(
        data, w,
        data + w * h, w / 2,
        data + w * h + w * h / 4, w / 2, w, h,
        dstyuv, dw,
        dstyuv + dw * dh, dw / 2,
        dstyuv + dw * dh + dw * dh / 4, dw / 2, dw, dh, libyuv::FilterMode::kFilterNone);

    unsigned char * sprgb = new unsigned char[dw*dh * 3];

	//libyuv进行YUV转换成RGB24
    libyuv::I420ToRGB24(dstyuv, dw,
        dstyuv + dw * dh, dw / 2,
        dstyuv + dw * dh + dw * dh / 4, dw / 2,
        sprgb, dw * 3, dw, dh);

    HDC hdc = GetDC(_playWnd);

    BITMAPINFO m_bmphdr = { 0 };
    DWORD dwBmpHdr = sizeof(BITMAPINFO);

    //24bit
    m_bmphdr.bmiHeader.biBitCount = 24;
    m_bmphdr.bmiHeader.biClrImportant = 0;
    m_bmphdr.bmiHeader.biSize = dwBmpHdr;
    m_bmphdr.bmiHeader.biSizeImage = 0;
    m_bmphdr.bmiHeader.biWidth = dw;

    m_bmphdr.bmiHeader.biHeight = -dh;
    m_bmphdr.bmiHeader.biYPelsPerMeter = 0;
    m_bmphdr.bmiHeader.biXPelsPerMeter = 0;
    m_bmphdr.bmiHeader.biClrUsed = 0;
    m_bmphdr.bmiHeader.biPlanes = 1;
    m_bmphdr.bmiHeader.biCompression = BI_RGB;

    RECT rtWnd;
    ::GetClientRect(_playWnd, &rtWnd);
    size_t wndWidth = abs(rtWnd.right - rtWnd.left);
    size_t wndHeight = abs(rtWnd.bottom - rtWnd.top);

    SetStretchBltMode(hdc, STRETCH_HALFTONE);

	//问题点:当出现特殊YUV分辨率时,调用此api导致绘制的效果为倾斜黑白,所以之前进行一次YUV缩放
    int nResult = StretchDIBits(hdc,
        0, 0,
        wndWidth, wndHeight,
        0, 0,
        dw, dh,
        sprgb,
        &m_bmphdr,
        DIB_RGB_COLORS,
        SRCCOPY);
    if (nResult == GDI_ERROR)
    {
        LOG_ERROR << "StretchDIBits return error";
    }

    delete[]dstyuv;
    delete[]sprgb;
    ReleaseDC(_playWnd, hdc);
}

还有其他解决方法,请留言一起学习学习。

经验分享 程序员 微信小程序 职场和发展