Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.09.28;
Скачать: CL | DM;

Вниз

Создание монохромного битмапа на WinAPI   Найти похожие ветки 

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

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

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

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

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


 
Renegat ©   (2008-08-13 01:01) [1]

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


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

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

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

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


 
Renegat ©   (2008-08-13 01:13) [3]

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


 
ProgRAMmer Dimonych ©   (2008-08-13 01:14) [4]

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


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?


 
ProgRAMmer Dimonych ©   (2008-08-13 01:16) [5]

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

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


 
ProgRAMmer Dimonych ©   (2008-08-13 01:18) [6]

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

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


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

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

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


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

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

Истинно так.


 
ProgRAMmer Dimonych ©   (2008-08-13 01:26) [9]

> Renegat ©

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

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


 
Renegat ©   (2008-08-13 01:31) [10]

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

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

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


 
Renegat ©   (2008-08-13 01:32) [11]

> С помощью GetDIBits

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


 
ProgRAMmer Dimonych ©   (2008-08-13 01:33) [12]

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

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

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


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

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

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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2008.09.28;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.028 c
15-1217852962
Fynjy
2008-08-04 16:29
2008.09.28
ehlib4


15-1217951365
TUser
2008-08-05 19:49
2008.09.28
Развелось тут интернет-магазинов


15-1218053693
Franciscosuarez
2008-08-07 00:14
2008.09.28
Красивая задача...может и встречалась тут)))не знаю


2-1219219368
silver222
2008-08-20 12:02
2008.09.28
ado paradox


2-1218734987
Dr.Andrew
2008-08-14 21:29
2008.09.28
Как запретить/разрешить ввод от клавиатуры любых символов ?