Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Создание монохромного битмапа на WinAPI


ProgRAMmer Dimonych ©   (2008-08-13 00:57:00) 

Пробовал через CreateBitmap (по справке), цветной - получился. Потом прочитал про CreateDIBSection - безрезультатно :(

Задача состоит в том, чтобы при запуске приложения создать средствами WinAPI битмап и немного порисовать на нём, чтобы в дальнейшем активно использовать. В битмапе будет два цвета - фона и "рисунка", поэтому монохромного больше чем достаточно.

Подошло бы и получившееся у меня "цветное решение" (ч/з CreateBitmap), но налицо бесполезная трата ОЗУ.

Once again.Монохромный битмап, рисование на нём функциями GDI и доступ к "картинке в памяти".


Sapersky   (2008-08-13 23:19:00) [1]

Версия поновее + спец. пример со шрифтами:
http://sapersky.narod.ru/files/AnyDX2D_v0.6.rar


Sapersky   (2008-08-13 19:59:00) [2]

Т.е. устройство вывода через SetTextureStageState будет настраиваться так, чтобы текстура использовалась только для определения, нужен пиксель или нет, а цвет пикселя указывался не текстурой, а вызовами других методов этого самого устройства. по идее, это должно быть оптимизировано, чтобы не съедать RGBA'й память. Но не уверен.

Сам DX ничего не оптимизирует, какой укажешь формат текстуры - такой и будет. Монохромных (однобитных) не бывает вообще, самое компактное из текстур с альфа-каналом это 16-битные D3DFMT_A1R5G5B5, D3DFMT_A4R4G4B4, ну или сжатый D3DFMT_DXT1 (4 бита на пиксель; если я правильно понял документацию, однобитный альфа-канал сжимается без потерь, в отличие от цвета).

В плане создания битмапа на API я рекомендовал бы не мучиться и использовать FastLIB (очень лёгкая обёртка над GDI + много спецэффектов). Как это можно сделать (и класс для вывода шрифта тоже):
http://sapersky.narod.ru/files/AnyDX2D_v0.5.rar


ProgRAMmer Dimonych   (2008-08-13 01:33:00) [3]

> Renegat ©   (13.08.08 01:31) [10]

Спасибо за помощь. Спокойной ночи.

Подождём-с до утра :)


Renegat   (2008-08-13 01:32:00) [4]

> С помощью GetDIBits

кстати да. Есть ещё CreateDIBSection - он тоже указатель возвращает.


Renegat   (2008-08-13 01:31:00) [5]

> С помощью GetDIBits - это самый удобный вариант?

Ну если без терморектального криптоанализа - думаю да =)
А вот насчёт DirectX я, увы, не силён. Я больше по части OpenGL...
Зато в этом хорошо разбирается @!!ex. Однако он сюда заглядывает редко.
Ну да ничего, модеры наверное перенесут ветку в "Игры".

Так что, спокойной ночи +)


ProgRAMmer Dimonych   (2008-08-13 01:26:00) [6]

> Renegat ©

DirectX. По идее текст будет одноцветным и сама текстура будет использоваться типа маски. Т.е. устройство вывода через SetTextureStageState будет настраиваться так, чтобы текстура использовалась только для определения, нужен пиксель или нет, а цвет пикселя указывался не текстурой, а вызовами других методов этого самого устройства. по идее, это должно быть оптимизировано, чтобы не съедать RGBA'й память. Но не уверен.

Получить доступ с ColorData... С помощью GetDIBits - это самый удобный вариант?


Renegat   (2008-08-13 01:22:00) [7]

> [5] ProgRAMmer Dimonych ©   (13.08.08 01:16)

А подо что пишем графику? Директ или ОГЛь? Если последнее, то образ текстуры так или иначе будет преобразован в RGBA, и потери памяти тут купировать удастся, только создав так наз. "текстурный объект" (а потом выбирать его из буфера объектов с помощью GLBindTexture), а затем просто удалив тот самый битмап, с которого текстура делалась. Если имеем дело с Директом, то тут не уверен. Не обернётся ли и тут монохром потерями на преобразование в RGBA?


Renegat   (2008-08-13 01:22:00) [8]

> [6] ProgRAMmer Dimonych ©   (13.08.08 01:18)

Истинно так.


ProgRAMmer Dimonych   (2008-08-13 01:18:00) [9]

> ProgRAMmer Dimonych ©   (13.08.08 01:14) [4]

Хотя нет. CreateBitmap, вроды как, пользует указатель только для первоначального заполнения битмапа? Или нет?


ProgRAMmer Dimonych   (2008-08-13 01:16:00) [10]

> Renegat ©   (13.08.08 01:13) [3]

Ну, вообще предполагается, что это будет текстура 256х256 для 16х16 символов заданным шрифтом. Потом она будет накладываться на спрайты и использоваться для вывода текста. С TBitmap уже давно бы сделал, но решил, чтобы не просто так, заодно подтянуть свои скромные знания по WinAPI.


ProgRAMmer Dimonych   (2008-08-13 01:14:00) [11]

О, кажется, я здорово ступил :)


ScrDC:=GetDC(Handle);
Tmp:=CreateBitmap(100,100,1,1,nil);
DrawDC:=CreateCompatibleDC(ScrDC);
SelectObject(DrawDC,Tmp);
Brush:=CreateSolidBrush(DWORD(-1));
//SelectObject(DrawDC,Brush);
Font:=CreateFont(0,0,0,0,0,0,0,0,0,0,0,0,0,'Carolina');
SelectObject(DrawDC,Font);

FillRect(DrawDC,Rect(0,0,100,100),Brush);
SetBkMode(DrawDC,TRANSPARENT);
TextOut(DrawDC,0,0,'12345',5);


Вот так вроде работает и остаётся только в CreateBitmap вместо nil использовать соответствующую переменную.

Такие вопросы...

1. Что есть нехорошего в этом участке кода?
2. Нужен ли закомментированный SelectObject?


Renegat   (2008-08-13 01:13:00) [12]

А если это только лишь шрифт и фон, не проще ли обойтись без битмапа вообще? Т.е. в чём конкретно состоит задача?


ProgRAMmer Dimonych   (2008-08-13 01:08:00) [13]

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

Как вообще создать монохромный битмап и получить device context для рисования на нём и доступ к его содержимому.

То, что делал я (работающее)... Создавал отдельно битмап требуемого размера. Создавал CompatibleDC, через SelectObject() прикручивал к этому DC этот битмап.  То же самое проделывал с Brush'ем (чтобы залить фон) и с шрифтом (чтобы писать текст).


Renegat   (2008-08-13 01:01:00) [14]

Можно сотворить финт ушами: сначала нарисовать то что нужно на "цветном" DIB-е, а потом перенести нарисованное на монохромный DDB и удалить DIB.


Наверх

Титульная страница Поиск, карта сайта Написать письмо