Страница: 1 |
|
Вопрос: Прозрачный фон у BMP
|
Добавлено: 20.12.02 17:48
|
|
Автор вопроса: SergeySV
|
Помогите разобраться вот с каким вопросом - помещаю BMP картинку на декстоп и хочу сделать ей прозрачный фон (чтобы только фигурка была без квадратной рамки с фоном). Для этого копирую ее на десктоп через функцию BitBlt, у который есть последний параметр, отвечающий за растровую операцию - цитирую: "Каждая растровая операция использует RGB-значение цвета исходного пиксела, чтобы определить новый цвет пиксела. " В связи с этим не могу понять: 1. Зачем, если я, например, выбираю константу - SRCERASE (Комбинирование перевернутых цветов прямоугольника адресата с цветами источника , используя поразрядный оператор AND) задавать этой константе какой-либо RGB цвет, если операция AND должна проводится между битами источника и адресата? 2. Как можно убрать фон, например белый, из BMP картинки? (или может вообще этого сделать по BitBlt нельзя, а только используя маску?) Долгие эксперименты показали, что: 1. Если взять BLACKNESS = &H885050, белый фон станет почти невидимый, а остальные цвета (зеленый преобладает) немного испоганятся. Правда черные буквы на десктопе тогда через картинку просвечивают. 2. Если взять SRCCOPY = а цвет близкий к зеленому, то типа скопируются только цвета близкие к зеленому, а белый фон станет почти невидимый. Правда картинка все равно поганится, ведь цвета разные (фон только один), а хотелось как раз наоборот.... ;-)
Ответить
|
Номер ответа: 1 Автор ответа: SeMa
ICQ: 166433794
Вопросов: 9 Ответов: 143
|
Профиль | | #1
|
Добавлено: 21.12.02 00:32
|
В DirectDraw ето можна через SetColorKey. Можеш попробовать сделать так чтобы там где фон картинки формы небыло (незнаю как ето наз.), ето через маску делаетса может хто подскажет, я не знаю как, а потом твою форму сделать parent десктопу.
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long dim t_wnd as long Private Sub Form_Load() t_wnd = FindWindow("Progman", "Program Manager") SetParent Me.hwnd, t_wnd End Sub
Ответить
|
Номер ответа: 2 Автор ответа: SergeySV
Вопросов: 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." Вот и думай, что делать.. . а если сходить по ссылке Q79212 - то там есть описание функции, которая делает тоже самое, что и TransparentBlt , только используя BitBlt - можно, в принципе, брать и использовать. Не знаю, вообщем, пока тестирую TransparentBlt, хочу проверить эту утечку....
Ответить
|
Номер ответа: 4 Автор ответа: SergeySV
Вопросов: 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 |
Поиск по форуму