CreateDIBSection возвращает несовместимые битовые значения для одного и того же изображения - PullRequest
0 голосов
/ 31 января 2020

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

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

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

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

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

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

  2. Я знал, что 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;
}

1 Ответ

0 голосов
/ 04 февраля 2020

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

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

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

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

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

Сводка:

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

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

...