-
Есть переменная Bk: TFastDIB это фоновый рисунок Есть переменная Img: TFastDIB это другой рисунок. Нужно вывести Img с блендингом в режиме Add.
Canvas.FillRect(Canvas.ClipRect); FBack.Draw(Canvas.Handle, 0, 0);
AddBlend(FImg, FBack, FBack);
FImg.AlphaDraw(Canvas.Handle, X, Y, 175, False);
-
-
Без разницы, в моем примере можно выводить без посторонних буфферов.
Как вывести 1 изображение на другое в режиме AddBlend-а? Там 3 параметра, что каждый означает?
procedure AddBlend(Dst,Src1,Src2:TFastDIB);
-
Src - source - откуда Dst - destination - куда Для большей универсальности источника два, но в принципе один из Src может быть равен Dst.
-
Почему то не получается:
AddBlend(Back, Img, Back);
Img.AlphaDraw(Canvas.Handle, X, Y, 175, False);
Должно вывести полупрозрачное изображение, которое стало немного ярче. Что не так?
-
Я ж говорю, первый параметр - куда рисовать. Ты рисуешь в Back, а выводишь Img. Для повышения яркости есть более простые методы, FastFX.Addition/Lightness, или просто увеличить коэфф. альфы при выводе.
-
> Sapersky (03.05.12 12:25) [5] > Src - source - откуда > Dst - destination - куда > Для большей универсальности источника два, но в принципе > один из Src может быть равен Dst.
> Я ж говорю, первый параметр - куда рисовать. Ты рисуешь > в Back, а выводишь Img.
Получается 2 варианта:
AddBlend(Back, Img, Img);
AddBlend(Back, Img, Back);
Img.Draw(Form1.Canvas.Handle, X, Y);
И не одни из них не работает как нужно. > Для повышения яркости есть более простые методы, FastFX. > Addition/Lightness
Эти 2 варинта тоже не работают: Изображение становится белесым, а не как при Add-блендинге.
Addition(Img, 60, 60, 60);
Lightness(Img, 60, 60, 60);
-
Мне нужно, чтобы была вот такая простая функция:
procedure DrawAlpha(DC; HDC; Dib: TFastDib; Mode: TBlendMode);
Это как в Flash AS3, можно выставить режим блендинга (add) и выводить с полупрозрачностью и все прекрасно.
-
На DC могут выводить только системные функции, TFastDIB.Draw/AlphaDraw - это обёртки над ними. При этом системные функции умеют максимум обычный альфа-блендинг (если брать только GDI, хотя есть ещё GDI+ и Direct2D). AddBlend и пр. - собственные функции фастлиба, работают с пикселями на низком уровне и могут рисовать только на TFastDIB, в крайнем случае, в область памяти. Поэтому, как я уже писал в [1], чтобы "всё было прекрасно" и можно было рисовать как хочется - создаём промежуточный буфер, рисуем в него фастлибовскими функциями, потом выводим буфер на DC. Если каких-то функций не хватает, дописываем самостоятельно. Так работают с любой пользовательской библиотекой (Graphics32, AggPas). Не нравится - смотри системные, но там если чего-то нет - самому уже не дописать.
В твоём случае, возможно, достаточно заранее подготовить более яркую версию картинки. Но как конкретно повышать яркость - я уже не понимаю, сложить картинку с собой (умножить на 2), что ли? Ну попробуй тогда AddBlend(Img, Img, Img). Или в дополнение к Addition/Lightness добавь контраста (Contrast). Если нужно "вот прям как во флэше" - смотри документацию по флэшу, может быть, там есть формулы для режимов блендинга.
-
-
procedure DrawAlpha(DC: HDC; X, Y: LongInt; Dib: TFastDIB; Alpha: byte);
const
ADD_FACTOR = 85;
var
Tmp: TFastDIB;
procedure _Add(Value: LongInt);
begin
Addition(Tmp, Value, Value, Value);
Contrast(Tmp, Value, Value, Value);
end;
begin
Tmp:= TFastDIB.Create;
try
Tmp.MakeCopy(Dib, True);
_Add(ADD_FACTOR);
Tmp.AlphaDraw(DC, X, Y, Alpha, False);
finally
Tmp.Free;
end;
end;
-
procedure DrawAlpha(DC: HDC; X, Y: LongInt; Dib: TFastDIB; Alpha: byte);
const
ADD_FACTOR = 85;
var
Tmp: TFastDIB;
procedure Add;
var
Lut: TLut;
begin
Lut:= AdditionLut(ADD_FACTOR);
ApplyLut(Tmp, Lut, Lut, Lut);
Lut:= ContrastLut(ADD_FACTOR);
ApplyLut(Tmp, Lut, Lut, Lut);
end;
begin
Tmp:= TFastDIB.Create;
try
Tmp.MakeCopy(Dib, True);
Add;
Tmp.AlphaDraw(DC, X, Y, Alpha, False);
finally
Tmp.Free;
end;
end;
-
Ещё можно сначала сложить LUT'ы (MergeLuts), потом применить результирующий к картинке. Должно быть несколько быстрее.
-
> Sapersky
Жму руку, спасибо что помог. :)
|