Модератор: Mikle
Наложения без прозрачности у тебя самописное софтовое
Mikle писал(а):Так, как ты сейчас грузишь, с помощью StdPicture, загрузить изображения с альфой не получится.
Mikle писал(а):Каждый из трёх компонентов (R G B) источника умножается на альфу источника, к произведению добавляется соответствующий компонент приёмника, умноженный на (255 - альфа_источника). Полученная сумма делится на 255. Результат помещаем в соответствующий компонент приёмника.
Private type Argb
A as byte
R as byte
G as byte
B as byte
End type
Dim src ad argb
Dim dst as argb
Dim res as argb
Dim multiAR as byte
Dim multiAG as byte
Dim multiAB as byte
MultiAR=src.a*src.r
MultiAG=src.a*src.g
MultiAB=src.a*src.b
Res.r=multiAr+dst.r*(255-src.a)
Res.g=multiAg+dst.g*(255-src.a)
Res.b=multiAb+dst.b*(255-src.a)
Почему не получится? Получится.
Premultiplied-alpha (прежде умноженая альфа?)
The trick писал(а):Почему не получится? Получится.
Don Leno писал(а):По твоим словам понимвю следующее:
Don Leno писал(а):мои переменые multiAR, multiAG, multiAB? И сохраняются прям в альфа канале файла?
Mikle писал(а):[С помощью LoadPicture? Речь не о ColorKey, а о полноценной альфе.
И сохраняются прям в альфа канале файла?
Исходя из моего выше описаного кода Premultiplied-alpha - это мои переменые multiAR, multiAG, multiAB?
В твоём коде будут переполнения, делай все промежуточные переменные (например MultiAR) типа Long.
Не вижу в конце деления на 255. Можно ценой небольших потерь в целях повышения производительности на 256.
Private type Argb
A as byte
R as byte
G as byte
B as byte
End type
Dim src ad argb
Dim dst as argb
Dim res as argb
Dim multiAR as Long
Dim multiAG as Long
Dim multiAB as Long
MultiAR=src.a*src.r
MultiAG=src.a*src.g
MultiAB=src.a*src.b
Res.r=(multiAr+dst.r*(255-src.a))/255
Res.g=(multiAg+dst.g*(255-src.a))/255
Res.b=(multiAb+dst.b*(255-src.a))/255
Don Leno писал(а):То есть можно просто взять 32-битный битмап и грузить его в PictureBox то изображение будет прозрачным?
Don Leno писал(а):То есть если я загружу через loadPicture 32-битный битмап и Сделаю GetDIBits то получу массив с альфа каналом?
Don Leno писал(а):А если из массива с альфой я отрисую на форму через SetDiBits то изображение тоже будет с альфой?
Да. Но так бы я не стал делать, т.к. BMP раздувают очень сильно файл. Лучше из PNG получить биты и использовать их.
Don Leno писал(а):Так верно??
Res.r=(multiAr+dst.r*(256-src.a))\256
Res.g=(multiAg+dst.g*(256-src.a))\256
Res.b=(multiAb+dst.b*(256-src.a))\256
Private Type ARGB
B As Byte
G As Byte
R As Byte
A As Byte
End Type
Private MainDc As Long
Private Spr() As Long
Private bi32BitInfo As BITMAPINFO
Private sprWidth As Long
Private sprHeight As Long
Private SprA() As ARGB
Private BufA() As ARGB
Public Sub DrawAlpha(Src As Sprite, Optional Sx As Long = 0, Optional Sy As Long = 0)
Dim i As Long
Dim multiAR As Long
Dim multiAG As Long
Dim multiAB As Long
ReDim SprA(sprHeight * sprWidth - 1)
CopyMemory SprA(0), Spr(0), UBound(Spr()) * 4
ReDim BufA(Src.Height * Src.Width - 1)
CopyMemory BufA(0), ByVal Src.DataPTR(0, 0), Src.Height * Src.Width * 4
For i = 0 To UBound(BufA())
multiAR = BufA(i).A * BufA(i).R
multiAG = BufA(i).A * BufA(i).G
multiAB = BufA(i).A * BufA(i).B
SprA(i).R = (multiAR + SprA(i).R * (256 - BufA(i).A)) \ 256
SprA(i).G = (multiAG + SprA(i).G * (256 - BufA(i).A)) \ 256
SprA(i).B = (multiAB + SprA(i).B * (256 - BufA(i).A)) \ 256
Next i
CopyMemory Spr(0), SprA(0), UBound(Spr()) * 4
End Sub
SprA(i).R = (multiAR + SprA(i).R * (256 - BufA(i).A)) \ 256
SprA(i).R =(0+255*(256-0)\256
SprA(i).R = (multiAR + SprA(i).R * (256& - BufA(i).A)) \ 256
Don Leno писал(а):может подскажешь как тогда загрузить данные из массива спрайта src без redimа?
Не утерпел
SprA(i).R = (multiAR + SprA(i).R * (256& - BufA(i).A)) \ 256
cD.R = (1& * cS.R * cS.A + cD.R * (256& - cS.A)) \ 256
Don Leno писал(а):А 1& обязательно нужен. В чем суть то? И почему в заменив (256 - BufA(i).A) на (256& - BufA(i).A) у меня перестало вылетать ошибка переполнения?
cD.R = (CLng(cS.R) * cS.A + cD.R * (256& - cS.A)) \ 256
Don Leno писал(а):первое число всегда должно быть Long чтобы не было переполнения?
a = 100
b = 100
c = 100
d = 100
Caption = 1& * a * b + c * d
a = 100
b = 100
c = 100
d = 100
Caption = 1& * a * b + 1& * c * d
Dim spr as sprite
spr.Index=100
spr.A=100
spr.R=200
spr.G=125
spr.B=15
Don Leno писал(а):А как тогда быть? Можно ли снизить потери производительности? Есть варианты?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 23