1

我正在尝试使用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,并且offscreenBuffervoid*从 openGL 正在渲染的屏幕外窗口复制的像素。

这段代码很好用,除了图像是颠倒的,我希望它垂直翻转。
我知道发生这种情况是因为:

如果 nHeightSrc 和 nHeightDest 有不同的符号,该函数创建位图沿 y 轴的镜像

但是当我删除减号并且目标和源高度相同时,我在窗口中看不到任何图像。
只是为了检查,我尝试在 上加上减号,sourceDimensions.height但这也导致没有图像,如果我尝试否定宽度(目标和源),也是如此。

知道为什么吗?
谢谢。

4

0 回答 0