我正在尝试使用StretchBlt将像素从内存 hdc 复制到窗口 hdc。
内存 hdc 从一个不可见的窗口获取图像,该窗口使用 openGL 呈现流。
这是我的代码:
BITMAPINFOHEADER createBitmapHeader(int width, int height) {
BITMAPINFOHEADER header;
header.biSize = sizeof(BITMAPINFOHEADER);
header.biWidth = width;
header.biHeight = height;
header.biPlanes = 1;
header.biBitCount = 32;
header.biCompression = BI_RGB;
header.biSizeImage = 0;
header.biXPelsPerMeter = 0;
header.biYPelsPerMeter = 0;
header.biClrUsed = 0;
header.biClrImportant = 0;
return header;
}
...
HDC memoryHdc = CreateCompatibleDC(windowHdc);
BITMAPINFO bitmapInfo;
bitmapInfo.bmiHeader = createBitmapHeader(targetDimensions.width, targetDimensions.height);
HBITMAP bitmap = CreateDIBitmap(windowHdc, &bitmapInfo.bmiHeader, CBM_INIT, offscreenBuffer, &bitmapInfo, DIB_RGB_COLORS);
SelectObject(memoryHdc, bitmap);
DeleteObject(bitmap);
SetStretchBltMode(windowHdc, COLORONCOLOR);
StretchBlt(windowHdc,
targetDimensions.x, targetDimensions.y,
targetDimensions.width, -targetDimensions.height,
memoryHdc,
sourceDimensions.x, sourceDimensions.y,
sourceDimensions.width, sourceDimensions.height,
SRCCOPY);
DeleteDC(memoryHdc);
windowHdc
我想要将像素复制到的窗口的 hdc 在哪里StretchBlt
,并且offscreenBuffer
是void*
从 openGL 正在渲染的屏幕外窗口复制的像素。
这段代码很好用,除了图像是颠倒的,我希望它垂直翻转。
我知道发生这种情况是因为:
如果 nHeightSrc 和 nHeightDest 有不同的符号,该函数创建位图沿 y 轴的镜像
但是当我删除减号并且目标和源高度相同时,我在窗口中看不到任何图像。
只是为了检查,我尝试在 上加上减号,sourceDimensions.height
但这也导致没有图像,如果我尝试否定宽度(目标和源),也是如此。
知道为什么吗?
谢谢。