Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Обработка картинок с помощью GetDIBits ()  (Прочитано 9808 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Kultura
Помогающий

ru
Offline Offline

« : 02-04-2009 17:36 » 

Задача: из бмп-шки (см. вложение) выделить 12 подкартинок - HBITMAP-ов, используя функцию GetDIBits ().

Проблема: функция отрабатывает без ошибок, но результат нулевой.

Вот она (если кто осилит, буду премного благодарен, ну а сам я уже готов сдаваться  Здесь была моя ладья...):

Код:
BOOL Pacman::InitializeGraphics ()
{
for (int i = 0; i < NUM_CREATURES; i++)
{
hbitComplexCreatures [i] = LoadBitmap (hInst, bitmapTitle [i]);
CheckForError (hbitComplexCreatures [i], TRUE);
}

BITMAP bm;
LPBITMAPINFO bmi;

HDC hdc = GetWindowDC (GetDesktopWindow());

for (int c = 0; c < NUM_CREATURES; c++)
{
if (GetObject (hbitComplexCreatures [c], sizeof (BITMAP), (LPVOID) & bm))
{
if (bmi = (LPBITMAPINFO) GlobalAlloc (GPTR,
sizeof (BITMAPINFOHEADER) + (bm.bmWidth * bm.bmHeight * sizeof (RGBQUAD))))
{
// Fill BITMAPINFO bmi struct
bmi->bmiHeader.biSize = sizeof (BITMAPINFOHEADER);
int ires = GetDIBits (hdc, hbitComplexCreatures [c],
0, bm.bmHeight, 0, bmi, DIB_RGB_COLORS);
CheckForError (&ires, ires);

int hcomplexbitSize = bmi->bmiHeader.biSizeImage;
char * hcomplexbits = 0;
if (hcomplexbits = (char *) GlobalAlloc (GPTR, hcomplexbitSize))
{
// Get current creature bitmap (complex) bits
ires = GetDIBits (hdc, hbitComplexCreatures [c],
0, bm.bmHeight, (LPVOID) hcomplexbits, bmi, DIB_RGB_COLORS);
CheckForError (&ires, ires);

int hbitWidth = bmi->bmiHeader.biWidth / NUM_SPRITES_INWIDTH;
int hbitHeight = bmi->bmiHeader.biHeight / NUM_SPRITES_INHEIGHT;
int hbitSize = hcomplexbitSize / NUM_SPRITES;
char * hbits = 0;
if (hbits = (char *) GlobalAlloc (GPTR, hbitSize))
{
// Divide complex creature bitmap
for (int m = 0; m < NUM_SPRITES_INHEIGHT; m++)
{
for (int n = 0; n < NUM_SPRITES_INWIDTH; n++)
{
for (int i = 0; i < hbitWidth; i++)
for (int j = 0; j < (hbitWidth * 4); j++)
{
hbits [i * (hbitWidth * 4) + j]  = hcomplexbits [i * (hbitWidth * 4) + j + m * bm.bmWidth + n * hbitWidth];
}

BITMAPINFO * bmi2;
if (bmi2 = (LPBITMAPINFO) GlobalAlloc (GPTR,
sizeof (BITMAPINFOHEADER) + (hbitWidth * hbitHeight * sizeof (RGBQUAD))))
{
hbitCreatures [c] [m * NUM_SPRITES_INWIDTH + n] = CreateCompatibleBitmap (hdc, hbitWidth, hbitHeight);

bmi2->bmiHeader.biSize = sizeof (BITMAPINFOHEADER);
int ires = GetDIBits (hdc, hbitCreatures [c] [m * NUM_SPRITES_INWIDTH + n],
0, hbitHeight, 0, bmi2, DIB_RGB_COLORS);
CheckForError (&ires, ires);

int iresult = SetDIBits (hdc, hbitCreatures [c] [m * NUM_SPRITES_INWIDTH + n],
0, hbitHeight, (LPVOID) hbits, bmi2, DIB_RGB_COLORS);
                                                                        GlobalFree (bmi2);
}
}
}
GlobalFree (bmi);
GlobalFree (hcomplexbits);
GlobalFree (hbits);
}
else
{
GlobalFree (bmi);
GlobalFree (hcomplexbits);
}
}
else
GlobalFree (bmi);
}
}
}
ReleaseDC (GetDesktopWindow (), hdc);

return TRUE;
}


* Pacman.bmp (12.13 Кб - загружено 936 раз.)
« Последнее редактирование: 02-04-2009 19:09 от Kultura » Записан
Kultura
Помогающий

ru
Offline Offline

« Ответ #1 : 03-04-2009 09:24 » 

Утро вечера мудренее.

Все, что связано с BITMAPINFO * bmi2 - лишнее. Достаточно bmi, только изменять ее перед вызовом SetDIBits ().
Еще для данной картинки неправильно заполняется hbits [], но это уже другая ошибка.

Проблема снята.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 03-04-2009 09:37 » 

какой код то в итоге ? ) Показывай, пригодится
Записан

Kultura
Помогающий

ru
Offline Offline

« Ответ #3 : 03-04-2009 12:14 » 

Итог:

Код:
BOOL Pacman::InitializeGraphics ()
{
for (int i = 0; i < NUM_CREATURES; i++)
{
hbitComplexCreatures [i] = LoadBitmap (hInst, bitmapTitle [i]);
CheckForError (hbitComplexCreatures [i], TRUE);
}

BITMAP bm;
LPBITMAPINFO bmi;

HDC hdc = GetWindowDC (GetDesktopWindow());

for (int c = 0; c < NUM_CREATURES; c++)
{
if (GetObject (hbitComplexCreatures [c], sizeof (BITMAP), (LPVOID) & bm))
{
if (bmi = (LPBITMAPINFO) GlobalAlloc (GPTR,
sizeof (BITMAPINFOHEADER) + (bm.bmWidth * bm.bmHeight * sizeof (RGBQUAD))))
{
// Fill BITMAPINFO bmi struct
bmi->bmiHeader.biSize = sizeof (BITMAPINFOHEADER);
int ires = GetDIBits (hdc, hbitComplexCreatures [c],
0, bm.bmHeight, 0, bmi, DIB_RGB_COLORS);
CheckForError (&ires, ires);

int hcomplexbitSize = bmi->bmiHeader.biSizeImage;
BYTE * hcomplexbits = 0;
if (hcomplexbits = (BYTE *) GlobalAlloc (GPTR, hcomplexbitSize))
{
// Get current creature complex bitmap bits
ires = GetDIBits (hdc, hbitComplexCreatures [c],
0, bm.bmHeight, (LPVOID) hcomplexbits, bmi, DIB_RGB_COLORS);
CheckForError (&ires, ires);

// Set sizes of little bitmap
int hbitWidth = bmi->bmiHeader.biWidth / NUM_SPRITES_INWIDTH;
int hbitHeight = bmi->bmiHeader.biHeight / NUM_SPRITES_INHEIGHT;
bmi->bmiHeader.biHeight = hbitHeight;
bmi->bmiHeader.biWidth = hbitWidth;

// hbits - new little bimap mask
int hbitSize = hcomplexbitSize / NUM_SPRITES;
BYTE * hbits = 0;
if (hbits = (BYTE *) GlobalAlloc (GPTR, hbitSize))
{
for (int m = NUM_SPRITES_INHEIGHT - 1; m >= 0; m--)
{
for (int n = 0; n < NUM_SPRITES_INWIDTH; n++)
{
// Fill bit mask for next little bitmap
for (int i = 0; i < hbitHeight; i++)
{
for (int j = 0; j < (hbitWidth * 4); j++)
{
hbits [i * (hbitWidth * 4) + j] =
hcomplexbits [i * (bm.bmWidth * 4) + j +
m * (bm.bmWidth * 4) * hbitHeight + n * (hbitWidth * 4)];
}
}

// Create and fill new 1 / NUM_SPRITES bitmap
hbitCreatures [c] [(NUM_SPRITES_INHEIGHT - 1 - m) * NUM_SPRITES_INWIDTH + n] = CreateCompatibleBitmap (hdc, hbitWidth, hbitHeight);
int iresult = SetDIBits (hdc, hbitCreatures [c] [(NUM_SPRITES_INHEIGHT - 1 - m) * NUM_SPRITES_INWIDTH + n],
0, hbitHeight, (LPVOID) hbits, bmi, DIB_RGB_COLORS);
CheckForError (&iresult, iresult);
}
}
GlobalFree (bmi);
GlobalFree (hcomplexbits);
GlobalFree (hbits);
}
else
{
GlobalFree (bmi);
GlobalFree (hcomplexbits);
return FALSE;
}
}
else
{
GlobalFree (bmi);
return FALSE;
}
}
}
}
ReleaseDC (GetDesktopWindow (), hdc);

return TRUE;
}

Если кто посмотрев, обнаружит ошибки и недочеты, пишите!
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines