Форум: "Начинающим";
Текущий архив: 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