Страница: 1 |
Вопрос: Прозрачный фон у BMP | Добавлено: 20.12.02 17:48 |
Автор вопроса: ![]() |
Помогите разобраться вот с каким вопросом - помещаю BMP картинку на декстоп и хочу сделать ей прозрачный фон (чтобы только фигурка была без квадратной рамки с фоном). Для этого копирую ее на десктоп через функцию BitBlt, у который есть последний параметр, отвечающий за растровую операцию - цитирую: "Каждая растровая операция использует RGB-значение цвета исходного пиксела, чтобы определить новый цвет пиксела. " В связи с этим не могу понять: 1. Зачем, если я, например, выбираю константу - SRCERASE (Комбинирование перевернутых цветов прямоугольника адресата с цветами источника , используя поразрядный оператор AND) задавать этой константе какой-либо RGB цвет, если операция AND должна проводится между битами источника и адресата? 2. Как можно убрать фон, например белый, из BMP картинки? (или может вообще этого сделать по BitBlt нельзя, а только используя маску?) 1. Если взять BLACKNESS = &H885050, белый фон станет почти невидимый, а остальные цвета (зеленый преобладает) немного испоганятся. Правда черные буквы на десктопе тогда через картинку просвечивают. 2. Если взять SRCCOPY = а цвет близкий к зеленому, то типа скопируются только цвета близкие к зеленому, а белый фон станет почти невидимый. Правда картинка все равно поганится, ведь цвета разные (фон только один), а хотелось как раз наоборот.... ;-) |
Ответы | Всего ответов: 4 |
Номер ответа: 1 Автор ответа: ![]() ![]() ICQ: 166433794 Вопросов: 9 Ответов: 143 |
Профиль | Цитата | #1 | Добавлено: 21.12.02 00:32 |
В DirectDraw ето можна через SetColorKey. Private Sub Form_Load() |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() Вопросов: 1 Ответов: 2 |
Профиль | Цитата | #2 | Добавлено: 23.12.02 14:42 |
Спасибо за ответ. Прикольные функции, с такими еще не работал.... посмотрим Покапавшись еще в других форумах, нашел упоминание об такой, относительно новой функции (в win98 есть, в во win32API вьюере о ней молчком) - TransparentBlt. Вот ссылка - http://www.vb.kiev.ua/ref/w32api/showdoc.php?f=transparentblt Проверил, работает. Правда очень требовательна к задаваемым размерам картинки: задашь больше, чем сама картинка и ничего не получишь (на MSDN об этом тоже написано). Еще на MSDN написано следующее: "Windows 95/98: TransparentBlt contains a memory leak that can exhaust system resources. To draw a transparent bitmap using BitBlt, see Knowledge Base article Q79212." Вот и думай, что делать.. Не знаю, вообщем, пока тестирую TransparentBlt, хочу проверить эту утечку.... |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ICQ: 134433 Вопросов: 25 Ответов: 44 |
Профиль | Цитата | #3 | Добавлено: 23.12.02 14:52 |
Я тут недавно разбирался все с функцией TransparentBlt Впринципе... все отлично, но только вот осталась одна проблема которую я не могу решить: я "рисую" этой функцией в PictureBox и для того что бы мне на этом же месте "перерисовать" картинку еще раз приходиться применять метод Cls а это вызывает моргание этого самого PictureBox'a .... Умнее пока ничего не придумал |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() Вопросов: 1 Ответов: 2 |
Профиль | Цитата | #4 | Добавлено: 23.12.02 15:16 |
Не совсем понятно, что ты точно делаешь в PictureBox... А вообще, общий способ избежать моргание, заключается в предварительной буферизации изображения - это, например, вирт. окно и т.д. Т.е. ты компануешь свою картинку в каком-либо Bitmap для временного хранения: ' получение эквивалент устройства PictureBox1.hdc для памяти memDC = CreateCompatibleDC(DeskTopDc) ' создание битовой карты hBit = CreateCompatibleBitmap(PictureBox1.hdc, x, y) ' выбор hBit в memDC SelectObject memDC, hBit ' С ним работаешь как с PictureBox1 .... например BitBlt memDC, 0, 0, 100, 100, PicBMP1, 0, 0, SRCCOPY TransparentBlt memDC, 0, 0, 100, 100, PicBMP2, 0, 0, vbWhite .... и т.д. ' и когда все готово, полученную итоговую картинку копируешь в PictureBox1 BitBlt Picture1.hdc, 0, 0, px, py, memDC, 0, 0, SRCCOPY |
Страница: 1 |
|