Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Прозрачный фон у BMP Добавлено: 20.12.02 17:48  

Автор вопроса:  SergeySV
 Помогите разобраться вот с каким вопросом - помещаю BMP картинку на декстоп и хочу сделать ей прозрачный фон (чтобы только фигурка была без квадратной рамки с фоном).

Для этого копирую ее на десктоп через функцию BitBlt, у который есть последний параметр, отвечающий за растровую операцию - цитирую: "Каждая растровая операция использует RGB-значение цвета исходного пиксела, чтобы определить новый цвет пиксела. "

   В связи с этим не могу понять:

1. Зачем, если я, например, выбираю константу - SRCERASE (Комбинирование перевернутых цветов прямоугольника адресата с цветами источника , используя поразрядный оператор AND) задавать этой константе какой-либо RGB цвет, если операция AND должна проводится между битами источника и адресата?

2. Как можно убрать фон, например белый, из BMP картинки? (или может вообще этого сделать по BitBlt нельзя, а только используя маску?)

 Долгие эксперименты показали, что:

1. Если взять BLACKNESS = &H885050, белый фон станет почти невидимый, а остальные цвета (зеленый преобладает) немного испоганятся. Правда черные буквы на десктопе тогда через  картинку просвечивают.

2. Если взять SRCCOPY = а цвет близкий к зеленому, то типа скопируются только цвета близкие к зеленому, а белый фон станет почти невидимый. Правда картинка все равно поганится, ведь цвета разные (фон только один), а хотелось как раз наоборот.... ;-)

Ответить

  Ответы Всего ответов: 4  

Номер ответа: 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, хочу проверить эту утечку.... :-)

Ответить

Номер ответа: 3
Автор ответа:
 Silent_Sky



ICQ: 134433 

Вопросов: 25
Ответов: 44
 Профиль | | #3 Добавлено: 23.12.02 14:52

Я тут недавно разбирался все с функцией TransparentBlt:)

Впринципе... все отлично, но только вот осталась одна проблема которую я не могу решить: я "рисую" этой функцией в PictureBox и для того что бы мне на этом же месте "перерисовать" картинку еще раз приходиться применять метод Cls а это вызывает моргание этого самого PictureBox'a .... Умнее пока ничего не придумал:(

Ответить

Номер ответа: 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 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам