Как отредактировать BITMAP после его загрузки win32 - PullRequest
1 голос
/ 15 декабря 2010

Как только я загрузил BITMAP из файла, с LoadImage:

HBITMAP renderBMP = (HBITMAP)LoadImage( NULL, filePath, IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE );

есть ли способ легко получить доступ и редактировать пиксели по отдельности?

Я могу использовать это для получения растрового объекта, но, похоже, это не помогает,

BITMAP bm;
GetObject(renderBMP, sizeof(bm), &bm);

потому что значение bmBits в структуре равно 0.

UPDATE:

Теперь я получаю ошибку с этим решением:

struct Pixel { unsigned char r,g,b,a; };
void Frame::PushMemory(HDC hdc)
{
  BITMAPINFO bi;
  ZeroMemory(&bi.bmiHeader, sizeof(BITMAPINFOHEADER));
  bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);

  GetDIBits(hdc, renderBMP, 0, bi.bmiHeader.biHeight, NULL, &bi, DIB_RGB_COLORS);

  /* Allocate memory for bitmap bits */
  Pixel* pixels = new Pixel[bi.bmiHeader.biHeight * bi.bmiHeader.biWidth];
  int n = sizeof(Pixel) * bi.bmiHeader.biHeight * bi.bmiHeader.biWidth;
  int m = bi.bmiHeader.biSizeImage;
  GetDIBits(hdc, renderBMP, 0, bi.bmiHeader.biHeight, pixels, &bi, DIB_RGB_COLORS);

  // Recompute the output
  //ComputeOutput(pixels);

  // Push back to windows
  //SetDIBits(hdc, renderBMP, 0, bi.bmiHeader.biHeight, pixels, &bi, DIB_RGB_COLORS );

  //delete pixels;
}

Я получаю эту ошибку:

Ошибка проверки времени выполнения # 2 - стек вокруг переменной 'bi' поврежден.

Последние три строки, кажется, не имеют значения, прокомментированы или нет.

Ответы [ 2 ]

3 голосов
/ 15 декабря 2010

Используйте GetDIBits для доступа к пикселям. Копирует все пиксели в указанный буфер. После модификации пикселей вы можете использовать SetDIBits для записи пикселей обратно в растровое изображение.

EDIT: Пример кода:

LPVOID lpvBits=NULL;    // pointer to bitmap bits array
BITMAPINFO bi;

ZeroMemory(&bi.bmiHeader, sizeof(BITMAPINFOHEADER));
bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);

if (!GetDIBits(hDC, hBmp, 0, height, NULL, &bi, DIB_RGB_COLORS))
    return NULL;

/* Allocate memory for bitmap bits */
if ((lpvBits = new char[bi.bmiHeader.biSizeImage]) == NULL)
    return NULL;

if (!GetDIBits(hDC, hBmp, 0, height, lpvBits, &bi, DIB_RGB_COLORS))
    return NULL;


/* do something with bits */


::SetDIBits( hDC, hBmp, 0, height, ( LPVOID )lpvBits, &bi, DIB_RGB_COLORS );
0 голосов
/ 15 декабря 2010

Если вы передадите флаг LR_CREATEDIBSECTION в LoadImage, он создаст специальный тип растрового изображения с разделом памяти пользовательского режима, содержащим биты растрового изображения.

GetObject в битовой карте DIBSection заполнит указатель bmPits структуры BITMAP или даже заполнит структуру DIBSECTION дополнительными данными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...