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