CreateDIBSection возвращает несовместимые битовые значения растрового изображения для одного и того же изображения

Это расширенный вопрос о CreateDIBSection.

Я использовал его, чтобы получить битовое значение bitMap того же изображения, которое было нарисовано с помощью Direct3D, чтобы проверить его согласованность с рендерингом Direct3D, то есть до тех пор, пока я получаю одно и то же битовое значение bitMap каждый раз, когда я запускаю программу (рисую то же изображение) тогда я считаю, что рендеринг Direct3D пройден.

Однако странно то, что я могу получить одно и то же битовое значение bitMap (из "изображения", как показано в приведенном ниже коде) только в первые 4 раза запуска программы (которые рисуют одно и то же изображение), а затем в 5-й раз., результат значений битов bitMap начнет немного изменяться (изменилось только небольшое количество байтов, большая часть оставшихся байтов останется прежней) и никогда не вернет те же значения битов bitMap, что и в первые 4 раза.

Но как только я перезагружаю компьютер и снова начинаю запускать свою программу, я возвращаюсь к тому же шаблону: битовые значения bitMap, которые я получаю в течение первых 4 раз запуска программы, точно такие же, как в первой пробной версии, но следующие запуски приведут к другим битовым значениям bitMap.

Две возможные причины, о которых я могу думать:

  1. Есть небольшая несогласованность в рендеринге с помощью графического процессора, что означает, что графический процессор может содержать некоторые дефекты, но я не являюсь экспертом по графическим процессорам, поэтому я не уверен, что могу сделать это таким образом.

  2. Я знал, что CreateDIBSection будет обрабатывать выделение памяти самостоятельно, возможно ли, что память не очищается должным образом после вызова DeleteObject и влияет на некоторые биты в значениях битов bitMap? (Я выполнил шаги по освобождению памяти в этом обсуждении, но это не помогает мне получить согласованные значения битов 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;
}

1 ответ

Решение

Я, наконец, являюсь основной причиной проблемы, которая не связана с CreateDBSection(), вместо этого она связана с углом поворота, который я передал в DirectX::XMMatrixRotationY для управления вращением рендеринга 3D-объекта (в разделе GraphicsClass::Frame() учебника, ссылка ниже).

Исходный код фактически не устанавливая его таким образом, что это будет цикл через рендеринг 3D объекта (и вращающееся) бесконечно, пока пользователь нажмет клавишу Esc, чтобы выйти, поэтому он делает вращение с переменным углом наклона статическим.

Но я хочу, чтобы трехмерный объект имел только одно полное вращение. Поскольку угол - статическая переменная, логика моей модифицированной программы неверна, которая делает только 1 полный оборот. Следовательно, статический угол накапливается из предыдущего прогона (я повторяю свой модифицированный тест несколько раз во время своей валидации), и это приводит к тому, что начальный угол поворота отличается для следующего повторного тестового прогона, поскольку угол увеличивается до тех пор, пока он не вернется в исходное положение. 0 градусов и начать заново.

И из-за этого небольшого сдвига окончательный кадр рендеринга остановится в другой части. Возвращаемые битовые значения растрового изображения из CreateDBSection() (я использую его для своей собственной проверки CRC, чтобы проверить согласованность рендеринга 3D-объекта), которые основаны на последнем отображаемом кадре после выполнения рендеринга и до того, как окно будет разрушено, будут конечно, отличается от начальных прогонов, и поэтому мой CRC (проверка циклическим избыточным кодом) будет постоянно меняться.

Я исправил свой код так, чтобы каждый раз при выполнении теста вращение всегда начиналось с нуля и заканчивалось на 360 градусов, а затем выходило из теста. После этого возвращаемые битовые значения растрового изображения согласованы независимо от того, сколько циклов я повторял для теста.

Резюме:

  1. CreateDBSection() не имеет проблем с возвращаемыми битовыми значениями растрового изображения (у меня проблема из-за того, что я не совсем понимаю рендеринг Direct3D и мой плохой C++, я буду улучшать себя;))
  2. Я пробовал обновления графического драйвера (проверив статус драйвера с помощью Intel Driver & Support Assistant, хотя в моем случае это не помогает, так как после проверки мой графический драйвер обновлен, это полезный шаг отладки в какой-то ситуации.

Спасибо всем за помощь.

Другие вопросы по тегам