Я пытаюсь создать функцию, которая рисует заданное изображение .bmp в заданном окне

239
01 февраля 2022, 12:30

Я понял, что скорее всего проблема либо на стадии создания массива Pixels, то есть я как-то неправильно обращаюсь к элементам динамического массива, либо на стадии передачи массива в функцию CreateBitmap. Ей нужен указатель void*, возможно дело в этом. Как передать значение правильно? (сейчас функция рисует пару строчек пикселей случайного цвета).

Функции set_pixel, get_pixel bitmap_image() это библиотека, которая находится тут: https://gist.github.com/kelbon/eedb4c093abf5c1d00a7cd332ae250f1

void DrawingBitmap(HDC kuda, unsigned int whereX, unsigned int whereY, const std::string &NameFile, unsigned int width, unsigned int height)
{
    bitmap_image input(width, height); 
    input = bitmap_image(NameFile);
    rgb_t perenos;
    unsigned int i, j;
    //выделение памяти под массив указателей на строки
    COLORREF** Pixels = new COLORREF * [height];
    // выделение памяти под пиксели в строках
    for (i = 0; i < height; i++)
    {
        Pixels[i] = new COLORREF[width];
    }
    //работа с массивом данных
    for (i = 0; i < height; i++)
    {
        for (j = 0; j < width; j++)
        {
            perenos = input.get_pixel(j, i);
            Pixels[i][j] = RGB(perenos.red, perenos.green, perenos.blue);
        }
    }
    //создал по взятому по номеру окну участок памяти, совместимый с устройством на который указывает hdcConsole
    HDC memDC = CreateCompatibleDC(kuda);
    HBITMAP memBM = CreateBitmap(width, height, 1, 32, Pixels);
    (HBITMAP)SelectObject(memDC, memBM);
    // Для контекста памяти устанавливаем тот же режим отображения, что используется в контексте отображения
    SetMapMode(memDC, GetMapMode(kuda));
    //рисую изображение
    BitBlt(kuda, whereX, whereY, width, height, memDC, 0, 0, SRCCOPY);
    // Восстанавливаем контекст памяти
    SelectObject(memDC, memBM);
    // Удаляем контекст памяти
    DeleteDC(memDC);
    // освобождение памяти в строках
    for (i=0;i<height;i++)
    {
        delete[] Pixels[i];
    }
    //освобождение памяти от массива указателей на строки
    delete[] Pixels;
}
Answer 1

CreateBitmap нужно передавать не массив строк, а сразу массив пикселей, размером width*height. По строкам надо только обеспечить выравнивание (Each scan line in the rectangle must be word aligned (scan lines that are not word aligned must be padded with zeros)). Скорее всего, выравнивание и так есть, можно подстраховаться:

assert( sizeof(COLORREF)*width % sizeof(WORD) == 0 );
READ ALSO
Одномерные массивы;c++

Одномерные массивы;c++

В одномерном массиве, состоящем из п целых элементов, вычислить: 1Номер максимального элемента массива; 2

117
Не могу разобраться с логикой задания

Не могу разобраться с логикой задания

На учёбе выдали вот такое задание:

102
Перемещение камеры вслед за персонажем

Перемещение камеры вслед за персонажем

Как сделать так, чтобы камера не флипалась (поворачивалась) вместе с персонажем, но перемещалась за с ним?

93