Сайт Влада

Как нанести изображение, сделав фоновый цвет прозрачным?

Допустим, вы делаете игру. Вы уже нарисовали кучу анимаций - изображений, где по порядку расположены все кадры, например, движений человечка на белом фоне. Вы делаете игру стандартными средствами ВБ - рисунок вы помещаете в PictureBox, но вот когда начинаете рисовать человечка на форме появляется большая проблемма - даже если изображение записано в GIF с прозрачным фоном, от куда бы вы его не срисовывали — с Image ли, или с PictureBox'а — вокруг него появится белый фон!

Такую проблему ВБ-шными средствами не решишь, зато есть подходящая специально для этого АПИ-функция — DrawTransparent.

Итак, создайте проект с формой, поместите туда модуль и объявите функцию:

Public Declare Function DrawTransparent Lib "msimg32" Alias "TransparentBlt" (ByVal hdcDest As Long, ByVal nXOriginDest As Long, ByVal nYOriginDest As Long, ByVal nWidthDest As Long, ByVal nHeightDest As Long, ByVal hdcSrc As Long, ByVal nXOriginSrc As Long, ByVal nYOriginSrc As Long, ByVal nWidthSrc As Long, ByVal nHeightSrc As Long, ByVal crTransparent As Long) As Long

Теперь вернемся к форме. Итак, нам понадобиться PictureBox с названием Picture1, который содержит в себе рисунок с белым фоном (в примере будет рассматриваться именно белый фон). Кстати, если вы загрузили GIF-изображение с прозрачным фоном, поставьте Picture1.BackColor = vbWhite.

Чтобы наша функция работала, необходимо настроить некоторые свойства у формы и рисунка. В событие Form_Load вставите следующий код:

Me.AutoRedraw = True
Me.ScaleMode = 3
Picture1.AutoRedraw = True
Picture1.AutoSize = True
Picture1.Visible = False
Picture1.ScaleMode = 3

Если вы зайдете в панель свойств VB, то увидите, что у формы и рисунка свойство HasDC = True. Это заставляет Windows создать для этих объектов контекст устройства - область для рисования и содержания графики, она представляется свойством .hDC, которое передается нашей функции с которого она будет рисовать и срисовывать.
Если объект скрыт, VB не перерисовывает его контекст, так что нам необходимо активировать свойство AutoRedraw как у рисунка, так и у формы.
Не менее важно установить у формы и рисунка режим работы с пикселями, так как АПИ-функции работают именно с ними.

А также, как я заметил, функция работает некорректно, если размер PictureBox'а меньше размера содержащегося в нем рисунка. А сам PictureBox лучше скрыть, чтобы он не мешался.

И вот все готово, чтобы заработала наша функция, дополните процедуру загрузки формы последней строкой:

Call DrawTransparent(Me.hdc, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight, Picture1.hdc, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight, RGB(255, 255, 255))

Смело запускайте проект и глядите на форму!


Оригинальная статья Влада Рубцова. https://vladikcomper.scanf.su/