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); }