Модератор: BV
При загрузке картинки из файла при включённом ColorKey, красный и синий каналы ColorKey меняются местами. Например, я указываю vbRed, а прозрачным становится синий, если указываю vbBlue, то прозрачный красный. Если указываю зелёный, то всё нормально.
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Function RGBToBGR(ByVal Color As Long) As Long
Dim ar(4) As Byte
CopyMemory ar(0), Color, 4
ar(4) = ar(0)
ar(0) = ar(2)
ar(2) = ar(4)
CopyMemory Color, ar(0), 4
RGBToBGR = Color
End Function
П.С.: Э-э-э... Простенькую функцию, чтобы байты местами меняла?.. Можно мне пример такой простенькой функции личным сообщением отправить?
Напиши простенькую функцию, которая меняла бы 1-ый и 3-ий байт в переменной с цветом местами.
Option Explicit
Dim Sp1 As New SR2D_Sprite
Dim Sp2 As New SR2D_Sprite
Private Sub Form_Load()
Sp1.LoadFromTGA "in.tga"
Sp2.Init Sp1.Width, Sp1.Height
Sp2.Draw Sp1, 0, 0, OpAlphaBlend
Sp2.Draw Sp1, 0, 0, OpMoveByte, 3, 3
Sp2.SaveToTGA "out.tga", True
Set Sp1 = Nothing
Set Sp2 = Nothing
End Sub
Function fncLayering(sprSpriteSource As SR2D_Sprite, sprSriteTarget As SR2D_Sprite, Optional lngTrgTop As Long, Optional lngTrgLeft As Long)
'Наложение спрайта с альфа-каналом поверх другого спрайта
'sprSpriteSource - спрайт-источник
'sprSriteTarget - спрайт-цель
'lngTrgTop - позиция верхнего края в sprSriteTarget
'lngTrgLeft - позиция левого края в sprSriteTarget
sprSriteTarget.Draw sprSpriteSource, lngTrgLeft, lngTrgTop, OpAlphaBlend
sprSriteTarget.Draw sprSpriteSource, lngTrgLeft, lngTrgTop, OpMoveByte, 3, 3
End Function
Function fncLayering(sprSpriteSource As SR2D_Sprite, sprSpriteTarget As SR2D_Sprite, Optional lngTrgTop As Long, Optional lngTrgLeft As Long)
'Наложение спрайта с альфа-каналом поверх другого спрайта
'sprSpriteSource - спрайт-источник
'sprSpriteTarget - спрайт-цель
'lngTrgTop - позиция верхнего края в sprSriteTarget
'lngTrgLeft - позиция левого края в sprSriteTarget
Dim sprAlphaSpriteOne As New SR2D_Sprite
Dim sprAlphaSpriteTwo As New SR2D_Sprite
'/инициализация буферов
sprAlphaSpriteOne.Init sprSpriteSource.Width, sprSpriteSource.Height
sprAlphaSpriteTwo.Init sprSpriteTarget.Width, sprSpriteTarget.Height
'\
sprSpriteTarget.Draw sprSpriteSource, lngTrgLeft, lngTrgTop, OpAlphaBlend 'отрисовывание цвета
sprAlphaSpriteOne.Draw sprSpriteSource, 0, 0, OpMoveByte, 3, 0 'получение альфы источника
sprAlphaSpriteTwo.Draw sprSpriteTarget, 0, 0, OpMoveByte, 3, 0 'получение альфы цели
sprAlphaSpriteTwo.Draw sprAlphaSpriteOne, 0, 0, OpAdd 'сложение алафа-каналов
sprSpriteTarget.Draw sprAlphaSpriteTwo, 0, 0, OpMoveByte, 0, 3 'отрисовывание альфа-канала
'/очистка буферов
Set sprAlphaSpriteOne = Nothing
Set sprAlphaSpriteTwo = Nothing
'\
End Function
- Код: Выделить всё
'/очистка буферов
Set sprAlphaSpriteOne = Nothing
Set sprAlphaSpriteTwo = Nothing
'\
Смотрим альфа-канал цели.
Если альфа-канал равен нулю, то копируем RGBA источника в RGBA цели.
Если альфа-канал не равен нулю, то смешиваем RGB источника с RGB цели по алгоритму AlphaBlend.
Складываем альфа-каналы источника и цели.
a = Dst.a + (255 - Dst.a) * Src.a \ 255
t = (255 - Src.a) * Dst.a \ 255
Dst.r = (t * Dst.r + Src.r * Src.a) \ a
Dst.g = (t * Dst.g + Src.g * Src.a) \ a
Dst.b = (t * Dst.b + Src.b * Src.a) \ a
Dst.a = a
Складываем альфа-каналы источника и цели
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 51