Модератор: Mikle
arthur2 писал(а):Есть серая маска, символизирующая альфа-канал. Как её наложить на существующую картинку.
arthur2 писал(а):обратная операция - есть картинка с альфа-каналом - как выделить серую картинку, пиксели которой символизировали бы альфа-канал?
SprBack.MaskClearBuffer SprA, 0, 0, Color, ARGB(128, 0, 0, 0), NotMask
arthur2 писал(а):все вопросы по SR2D складывать в одну тему или лучше для каждого вопроса создать свою?
Spr1.MoveByte Spr2, 0, 0, ChRed, ChAlpha
arthur2 писал(а):просто для каждого пикселя среднее арифметическое от R, G, и B
Col = ((B * 28 + G * 150 + R * 77) \ 255) * &H10101
Spr.MulAddS2X Spr, 0, 0, ARGB(0, 64, 64, 64), ARGB(0, 192, 192, 192)
Spr.DrawDPBM Spr, 0, 0, 77, 150, 28, 0.675
А в чем тут математический принцип, что именно делает формула?Mikle писал(а):Более правильно так
А как это работает?Mikle писал(а):но можно сделать с небольшой потерей точности так
Здесь 64- это на сколько каждый из RGB становится ярче, а 192 - контрастней? Точнее, наверное, 64 - это -64, а 192 - это +64, так?С помощью метода MulAddS2X можно изменять яркость и контрастность. Значение из источника
умножается покомпонентно на параметр Mul, к произведению добавляется значение Add, далее из
него вычитается 128 (как будто Add - число со знаком) и полученная величина умножается на 2.
s.MulAddS2X s, 0, 0, ARGB(0, 64, 64, 64), ARGB(0, 192, 192, 192)
s.DrawDPBM s, 0, 0, 77, 150, 28, 0.675
fn.Draw s, 0, 0, OpAlphaBlend
fn.PaintToDevice hdc
s.MulAddS2X s, 0, 0, ARGB(0, 64, 64, 64), ARGB(0, 192, 192, 192)
fn.DrawDPBM s, 0, 0, 77, 150, 28, 0.675
fn.PaintToDevice hdc
arthur2 писал(а):DrawDPBM - это мы картинку как бы освещаем?
arthur2 писал(а):Здесь 64- это на сколько каждый из RGB становится ярче, а 192 - контрастней?
arthur2 писал(а):А в чем тут математический принцип, что именно делает формула?
arthur2 писал(а):Но так не рисуется альфа-канал.
arthur2 писал(а):Послеs.MulAddS2X s, 0, 0, ARGB(0, 64, 64, 64), ARGB(0, 192, 192, 192) - альфа-канал, я так понимаю, обнуляется?
ARGB(128, 64, 64, 64), ARGB(128, 192, 192, 192)
ПонялMikle писал(а):Учитывает весовые коэффициенты компонентов.
Mikle писал(а):Да, но освещение, использующее нормали и вектор света, совпадает по формуле с нужной нам
Ага, догадался, после того, как послал вопрос. И даже пост исправил. Но, кажется, понял не совсем Картинка становится менее яркой (-64), но более контрастной (+64)? Или наоборот?Mikle писал(а):Вектора используют числа со знаком
Это будет не оригинальный альфа-канал. Я, как догадался, что альфа обнуляется, сделал, сохранив изначальный альфа-канал во временный спрайт.Mikle писал(а):Просто перекинь любой канал из RGB (они теперь одинаковые) в альфу с помощью MoveByte
Ну, полностью задача ещё не сформировалась Пока примеряюсь, как использовать то, до чего удаётся дотянуться пониманием.Mikle писал(а):Опиши полностью задачу.
arthur2 писал(а):Картинка становится менее яркой (-64), но более контрастной (+64)? Или наоборот?
arthur2 писал(а):Получается, что освещение работает по формуле Col = ((B * Lz+ G * Ly+ R * Lx) \ 255) * &H10101 ?
Brite = N.z * L.z+ N.y * L.y+ N.x * L.x
А где про это почитать? В других темах встретил:Mikle писал(а):Где N иL - нормализованные вектора нормали и направления на источник света.
А что за книга? Где её можно посмотреть? По форуму не нашелMikle писал(а):Я это более-менее подробно в книге описывал.
неправильно. А правильно, что 64 так +64и есть, а вот 192 как раз -64. Так?arthur2 писал(а):наверное, 64 - это -64, а 192 - это +64, так?
arthur2 писал(а):что за книга?
arthur2 писал(а):где про это почитать?
H80=-128
Hff=-1
UnSigned: 0 127 128 255
Signed : -128 -1 0 127
Sub DrawGradient(cARGB1 As Long, cARGB2 As Long, Optional Vert As Boolean, Optional Left As Long, Optional Top As Long, Optional Width As Long, Optional Height As Long, Optional IsXor As Boolean)
If meWidth = 0 Or meHeight = 0 Then
Init Width, Height
Else
If Width = 0 Then Width = meWidth
If Height = 0 Then Height = meHeight
End If
If Vert Then
For i = 0 To Height
DrawLine Left, i + Top, Left + Width, i + Top, ColLerp(cARGB2, cARGB1, i / Height), , IsXor
Next
Else
For i = 0 To Width
DrawLine Left + i, Top, Left + i, Height + Top, ColLerp(cARGB2, cARGB1, i / Width), , IsXor
Next
End If
End Sub
Private Function ColLerp(ByVal c1 As Long, ByVal c2 As Long, ByVal k As Single) As Long
Dim A As Integer, R As Integer, G As Integer, B As Integer, a1plus As Long, a2plus As Long
'Подправляем сбой на минус лонг при A>127:
If c1 < 0 Then 'значит, A>127 и, как следствие, Long отрицательный
c1 = c1 + 2147483647 + 1& 'прибавляем МаксЛонг, который вообще-то есть половина действит.макса (столько же ниже нуля)
a1plus = 128&
End If
If c2 < 0 Then 'значит, A>127 и, как следствие, Long отрицательный
c2 = c2 + 2147483647 + 1& 'прибавляем МаксЛонг, который вообще-то есть половина действит.макса (столько же ниже нуля)
a2plus = 128&
End If
'Составляем цвет из двух:
A = (((c1 \ 16777216) And 255&) + a1plus) * k + (((c2 \ 16777216) And 255&) + a2plus) * (1 - k)
R = ((c1 \ 65536) And 255&) * k + ((c2 \ 65536) And 255&) * (1 - k)
G = ((c1 \ 256&) And 255&) * k + ((c2 \ 256&) And 255&) * (1 - k)
B = (c1 And 255&) * k + (c2 And 255&) * (1 - k)
ColLerp = ARGB(A, R, G, B)
End Function
Public Sub DrawGreyColored(src As SR2D_Sprite, Optional ByVal A As Byte = 128, Optional ByVal R As Byte = 128, Optional ByVal G As Byte = 128, Optional ByVal B As Byte = 128, Optional Left As Long = 0, Optional Top As Long = 0, Optional И_ЗАПОМНИ As Enum_Draw = False, Optional Tag, Optional Tag2, Optional Tag3)
'Спрайт src должен быть в серых тонах (тона вокруг RGB(128,128,128). На него накладывается цвет.
If Height = 0 Or Width = 0 Then Init src.Width, src.Height
MulAddS2X src, Left, Top, ARGB(255 - A, 255 - R, 255 - G, 255 - B), ARGB(A, R, G, B)
If И_ЗАПОМНИ Then Проверь_запоминание src, Tag, Tag2, Tag3
End Sub
MulAddS2X src, Left, Top, ARGB(255 - A, 255 - R, 255 - G, 255 - B), ARGB(A, R, G, B)
MulAddS2X src, Left, Top, ARGB(128, 255 - R, 255 - G, 255 - B), ARGB(128, R, G, B)
MulAddS2X src, Left, Top, ARGB(128, 255 - R, 255 - G, 255 - B), ARGB(A, R, G, B)
Сейчас этот форум просматривают: SemrushBot и гости: 27