![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание монохромного битмапа на 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.