· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Функция GetDIBits

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Ноя 24, 2003 13:12:20

Подскажите как правильно обращаться с GetDIBits.
Делаю так:
invoke	CreateBitmap, 1024, 1024, 1, 24, NULL
mov	hBitmap, EAX
	
invoke	CreateCompatibleDC, NULL
mov	dc, EAX

mov	bi.bmiHeader.biSize, sizeof(BITMAPINFOHEADER)
	
invoke	GetDIBits, dc, hBitmap, 0, 1024, 0, addr bi, DIB_RGB_COLORS 	
.if EAX == 0
	return	-1
.endif

и получаю ошибку.

А если создаю 16-битный битмап,
invoke	CreateBitmap, 1024, 1024, 1, 16, NULL

то проходит нормально.
В чем загвоздка? Как сделать, чтобы работала в обоих случаях?


Дата: Ноя 24, 2003 13:45:26

Zoda
bitmap нужно выбрать в контексте устройства.
Чтобы заполнить структуру высота тоже должна быть нулевой.
Потом уже можно получать сами данные, передав заполненную структуру, и указатель на массив пикселей.


Дата: Ноя 24, 2003 15:03:51

Zoda
Посмотри исходник PaintView, процедуру BitmapToFile.
Там при первом вызове получаем размер растра, а при втором
битовы массив.


Дата: Ноя 24, 2003 18:53:03

Можно посмотреть на код здесь: http://www.codexxi.com/MyBlocks.html


Дата: Ноя 25, 2003 12:03:06 · Поправил: Zoda

bitmap нужно выбрать в контексте устройства.
Имеется в виду SelectObject? Если так, то не помогает.

Чтобы заполнить структуру высота тоже должна быть нулевой.
По-моему, чтобы заполнить структуру, должен быть NULL вместо указателя на массив

Посмотри исходник PaintView, процедуру BitmapToFile
А в чем особенность? Инициализация структуры не помогает.

Может быть не нужно проверять результат функции на НОЛЬ?


Дата: Ноя 25, 2003 12:16:54

Zoda
Возможно что битмап не совместим с контекстом устройства. Попробуй сделать так:
invoke CreateBitmap, 1024, 1024, 1, 32, NULL


Дата: Ноя 25, 2003 12:32:29 · Поправил: Zoda

Black_mirror
Возможно что битмап не совместим с контекстом устройства
Похоже что так. Из-за чего это и как от этого избавиться?

invoke CreateBitmap, 1024, 1024, 1, 32, NULL
Выдает ошибку. (Если в настройках "Свойства экрана" поставить глубину цвета 32 бита, то ошибка не возникает... что за....)


Дата: Ноя 25, 2003 13:05:11

Zoda
CreateCompatibleBitmap?


Дата: Ноя 25, 2003 13:10:21

Zoda
Избавится от этого нельзя.

А что вообще должна делать программа?


Дата: Ноя 25, 2003 13:12:39

q_q
CreateCompatibleBitmap не такая простая штука. Если его вызвать для контекста созданого функцией CreateCompatibleDC, то bitmap почему-то получается двухцветным.


Дата: Ноя 25, 2003 13:19:39

Black_mirror
А что вообще должна делать программа?
Хочу из битмапа текстуру сделать (dx8).
Видимо нужно искать другие пути.


Дата: Ноя 25, 2003 13:49:49

Zoda
Мне функция CreateBitmap, вообще не нравиться, она создаёт
апаратно - зависимый DDB растр (не рыба ни мясо), может лучше создать диб секцию.


Дата: Ноя 25, 2003 13:59:29

Я CreateDIBSection юзаю, когда нужно обработать что-то в dc как массив COLORREF.


Дата: Ноя 25, 2003 16:14:29

masquer
В этом то и прелесть CreateDIBSection, обеспечивает прямой доступ к массиву пикселов, поддерживает все типы сжатия, даже RLE, но прямая запись реальна только для, 32,24,16, битных изображений т.к. сжатие пока найдёшь нужный пиксел замучаешься.
Может GetDIBits, не работает, т.к. растр ты не выбрал в контекст устройства Black_mirror прав,Zoda
ты при вызове GetDIBits, указываешь контекст, а растра та там нету, это явная ошибка, блин как я раньше не зметил,
наверно старею.
Также возможно растр надо инициализировать (заполнить цветом), какие пиксельные данные растра ты хочешь выбирать, если ничего ещё не нарисовал.
Кроме того ты должен заполнить структуру BITMAPINFOHEADER,
обязательно указав формат растра, т.е. в каком виде, с каким сжатием извлечь пиксельные данные, лучше с помощью
GetDIBits узнать сначала размер растра, а потом выбрать данные.


Дата: Ноя 25, 2003 18:40:12

А разве мой код (www.codexxi.com -> Components) не работает?
Там снимается HDC в HBITMAP.
А потом используя GetDIBits() и пишется BMP файл на диск.

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.168