Это расширенный вопрос о CreateDIBSection .
. Я использовал его, чтобы получить значение бита bitMap того же изображения, которое нарисовано с использованием Direct3D, чтобы проверить его согласованность при визуализации Direct3D, т.е. до тех пор, пока я получаю одно и то же значение бита bitMap каждый раз, когда я запускаю программу (рисую одно и то же изображение), я считаю, что рендеринг Direct3D прошел.
Однако странная вещь заключается в том, что я могу получить только то же значение бита bitMap (из «изображения», как показано в приведенном ниже коде) для первых 4 раз выполнения программы (которые рисуют одно и то же изображение), 5-й раз, результат значений битов bitMap начнет слегка изменяться (изменилось только небольшое количество байтов, большинство оставшихся байтов остались прежними), и никогда не вернутся те же битовые значения битовой карты, что и первые 4 раза.
Но, как только я перезагружаю компьютер и начинаю снова запустив мою программу, я получаю тот же шаблон: значения битов bitMap, которые я получаю в течение первых 4 раз выполнения программы, точно так же, как в первом испытании, но следующие запуски приведут к различным битовым значениям bitMap.
Две возможные причины, о которых я могу думать:
Есть некоторые Небольшое несоответствие в рендеринге с помощью графического процессора означает, что в графическом процессоре могут быть некоторые дефекты, но я не эксперт по графическим процессорам, поэтому у меня нет уверенности, что я могу сделать это таким образом.
Я знал, что CreateDIBSection будет обрабатывать выделение памяти самостоятельно, возможно ли, что память не очищается должным образом после вызова DeleteObject и влияет на некоторые биты в бите bitMap ценности? (Я следовал шагам освобождения памяти в этом обсуждении , но это не помогает мне получить согласованные значения битовых битов для одного и того же изображения.)
Вопрос: Как мы можем получить непротиворечивое битовое значение 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;
}