这是一个关于CreateDIBSection的扩展问题。
我用它来获取使用Direct3D绘制的同一幅图像的bitMap位值,以验证其Direct3D渲染的一致性,即只要我每次运行程序时获得相同的bitMap位值(绘制相同的图像),然后我认为 Direct3D 渲染通过了。
然而,奇怪的是,在运行程序的前 4 次(绘制相同的图像),第 5 次之后,我只能获得相同的位图位值(来自下面代码中所示的“图像”) ,bitMap 位值的结果会开始轻微变化(只有少量字节改变,其余大部分字节保持不变),永远不会取回与前 4 次相同的 bitMap 位值。
但是,一旦我重新启动计算机并再次开始运行我的程序,我又回到了相同的模式:我在运行程序的前 4 次中得到的 bitMap 位值与第一次试验完全相同,但以下运行将导致不同的位图位值。
我能想到的两个可能的原因:
GPU的渲染有一些轻微的不一致,意味着GPU可能存在一些缺陷,但我不是GPU专家,所以我真的没有信心以这种方式得出结论。
我知道 CreateDIBSection 将自行处理内存分配,是否有可能在调用 DeleteObject 后内存未正确清理并影响 bitMap 位值中的某些位?(我在这个讨论中遵循了释放内存的步骤,但这并不能帮助我获得相同图像的一致位图位值。)
问题:当我们从同一个图像中获取它时,我们如何每次都获得一致的位图位值(这可能吗?)?
谢谢。
代码:
#include <Windows.h>
#include <cstdint>
HWND m_hwnd;
void GetBitMapInfo(const int& x_Coordinate, const int& y_Coordinate, const int& iWidth, const int& iHeight)
{
DWORD imageSize = iWidth * iHeight * 4;
// Get the display window
HDC displayWindow = GetDC(m_hwnd);
HDC hdc = CreateCompatibleDC(displayWindow);
// Fill in the Bitmap information
BITMAPINFO bmpInfo;
ZeroMemory(&bmpInfo, sizeof(BITMAPINFO));
bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpInfo.bmiHeader.biWidth = iWidth;
bmpInfo.bmiHeader.biHeight = iHeight;
bmpInfo.bmiHeader.biPlanes = 1;
bmpInfo.bmiHeader.biBitCount = 32;
bmpInfo.bmiHeader.biCompression = BI_RGB;
bmpInfo.bmiHeader.biSizeImage = 0;
bmpInfo.bmiHeader.biClrUsed = 0;
bmpInfo.bmiHeader.biClrImportant = 0;
// Create the storage for the pixel information
uint8_t* image = nullptr;
// Populate the storage with the BMP pixel information
HBITMAP hBitmap = CreateDIBSection(hdc, &bmpInfo, DIB_RGB_COLORS, (void**)(&image), nullptr, NULL);
HGDIOBJ save = SelectObject(hdc, hBitmap);
BitBlt(hdc, x_Coordinate, y_Coordinate, iWidth, iHeight, displayWindow, 0, 0, SRCCOPY);
DeleteObject(SelectObject(hdc, save));
DeleteDC(hdc);
DeleteDC(displayWindow);
DeleteObject(hBitmap);
return;
}
int main()
{
GetBitMapInfo(0, 0, 1920, 1080);
return 0;
}