Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.09.28;
Скачать: [xml.tar.bz2];

Вниз

Создание монохромного битмапа на 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.044 c
1-1198970356
booratino
2007-12-30 02:19
2008.09.28
как смотреть дамп в hex


3-1206443287
denis24
2008-03-25 14:08
2008.09.28
Прямой доступ к ораклу без одбс


8-1186690843
Spok
2007-08-10 00:20
2008.09.28
как зациклить MediaPlayer?


2-1218698459
kopernik21187
2008-08-14 11:20
2008.09.28
параметр SQL-запроса в ADOQuery


15-1218183143
Dennis I. Komarov
2008-08-08 12:12
2008.09.28
Аборигены! Тут никого не будет? (вторник)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский