📄 bseffects.pas
字号:
r := Round(Line^[x].r * kf1 + L^[x].r * (1 - kf1));
g := Round(Line^[x].g * kf1 + L^[x].g * (1 - kf1));
b := Round(Line^[x].b * kf1 + L^[x].b * (1 - kf1));
CheckRGB(r, g, b);
Line^[x].r := r;
Line^[x].g := g;
Line^[x].b := b;
end;
ScanLines[y] := Line;
kf1 := kf1 + Step;
if kf1 > 1 then kf1 := 1;
end;
FreeMem(Line, Width * 3);
end;
procedure TbsEffectBmp.MorphGrad;
begin
if Width >= Height
then MorphHGrad(BMP, kf)
else MorphVGrad(BMP, kf);
end;
procedure TbsEffectBmp.MorphLeftGrad;
var
x, y, r, g, b: Integer;
Line, L: PLine;
kf1: Double;
step: Double;
f : Integer;
begin
if (BMP.Width <> Width) or (BMP.Height <> Height) then Exit;
GetMem(Line, Width * 3);
f := Round(Width * kf);
if f < 1 then f := 1;
if f > Width - 1 then f := Width - 1;
if f > 0
then
Step := 1 / f
else
Step := 1;
for y := 0 to Height - 1 do
begin
GetScanLine(y,Line);
L := BMP.ScanLines[y];
kf1 := 0;
for x := 0 to f do
begin
r := Round(Line^[x].r * kf1 + L^[x].r * (1 - kf1));
g := Round(Line^[x].g * kf1 + L^[x].g * (1 - kf1));
b := Round(Line^[x].b * kf1 + L^[x].b * (1 - kf1));
CheckRGB(r, g, b);
Line^[x].r := r;
Line^[x].g := g;
Line^[x].b := b;
kf1 := kf1 + Step;
if kf1 > 1 then kf1 := 1;
end;
ScanLines[y] := Line;
end;
FreeMem(Line, Width * 3);
end;
procedure TbsEffectBmp.MorphRightGrad;
var
x, y, r, g, b: Integer;
Line, L: PLine;
kf1: Double;
step: Double;
f : Integer;
begin
if (BMP.Width <> Width) or (BMP.Height <> Height) then Exit;
GetMem(Line, Width * 3);
f := Width - Round(Width * kf);
if f < 0 then f := 0;
if f > Width - 1 then f := Width - 1;
if Width - f > 0
then
Step := 1 / (Width - f)
else
Step := 1;
for y := 0 to Height - 1 do
begin
GetScanLine(y,Line);
L := BMP.ScanLines[y];
kf1 := 0;
for x := Width - 1 downto f do
begin
r := Round(Line^[x].r * kf1 + L^[x].r * (1 - kf1));
g := Round(Line^[x].g * kf1 + L^[x].g * (1 - kf1));
b := Round(Line^[x].b * kf1 + L^[x].b * (1 - kf1));
CheckRGB(r, g, b);
Line^[x].r := r;
Line^[x].g := g;
Line^[x].b := b;
kf1 := kf1 + Step;
if kf1 > 1 then kf1 := 1;
end;
ScanLines[y] := Line;
end;
FreeMem(Line, Width * 3);
end;
procedure TbsEffectBmp.MorphPush(BMP: TbsEffectBMP; Kf: Double);
var
x, y, x1: Integer;
Line, L: PLine;
f : Integer;
begin
if (BMP.Width <> Width) or (BMP.Height <> Height) then Exit;
GetMem(Line, Width * 3);
f := Round(Width * kf);
if f < 0
then f := 0
else if f > Width - 1 then f := Width - 1;
for y := 0 to Height - 1 do
begin
GetScanLine(y,Line);
L := BMP.ScanLines[y];
for x := Width - 1 downto f do
begin
x1 := x - f - 1;
if x1 < 0 then x1 := 0;
Line^[x].r := Line^[x1].r;
Line^[x].g := Line^[x1].g;
Line^[x].b := Line^[x1].b;
end;
ScanLines[y] := Line;
end;
for y := 0 to Height - 1 do
begin
GetScanLine(y,Line);
L := BMP.ScanLines[y];
x1 := Width - f - 1;
if x1 < 0 then x1 := 0;
for x := 0 to f do
begin
Line^[x].r := L^[x1].r;
Line^[x].g := L^[x1].g;
Line^[x].b := L^[x1].b;
inc(x1);
if x1 > Width - 1 then x1 := Width - 1;
end;
ScanLines[y] := Line;
end;
FreeMem(Line, Width * 3);
end;
procedure TbsEffectBmp.MorphLeftSlide;
var
x, y, x1: Integer;
Line, L: PLine;
f : Integer;
begin
if (BMP.Width <> Width) or (BMP.Height <> Height) then Exit;
GetMem(Line, Width * 3);
f := Round(Width * kf);
if f < 1 then f := 1;
if f > Width - 1 then f := Width - 1;
for y := 0 to Height - 1 do
begin
GetScanLine(y,Line);
L := BMP.ScanLines[y];
x1 := Width - 1 - f;
if x1 < 0 then x1 := 0;
for x := 0 to f - 1 do
begin
inc(x1);
if x1 > Width -1 then x1 := Width - 1;
Line^[x].r := L^[x1].r;
Line^[x].g := L^[x1].g;
Line^[x].b := L^[x1].b;
end;
ScanLines[y] := Line;
end;
FreeMem(Line, Width * 3);
end;
procedure TbsEffectBmp.MorphRightSlide;
var
x, y, x1: Integer;
Line, L: PLine;
f : Integer;
begin
if (BMP.Width <> Width) or (BMP.Height <> Height) then Exit;
GetMem(Line, Width * 3);
f := Round(Width * kf);
if f < 1 then f := 1;
if f > Width - 1 then f := Width - 1;
for y := 0 to Height - 1 do
begin
GetScanLine(y,Line);
L := BMP.ScanLines[y];
x1 := Width - 1 - f;
if x1 < 0 then x1 := 0;
for x := 0 to f - 1 do
begin
inc(x1);
if x1 > Width -1 then x1 := Width - 1;
Line^[x1].r := L^[x].r;
Line^[x1].g := L^[x].g;
Line^[x1].b := L^[x].b;
end;
ScanLines[y] := Line;
end;
FreeMem(Line, Width * 3);
end;
destructor TbsEffectBmp.Destroy;
begin
DeleteObject(Handle);
inherited;
end;
procedure TbsEffectBmp.ChangeBrightness(Kf: Double);
var
x, y, r, g, b: Integer;
Line: PLine;
begin
if Kf < 0 then Kf := 0 else if Kf > 1 then Kf := 1;
GetMem(Line, Width * 3);
for y := 0 to Height - 1 do
begin
GetScanLine(y, Line);
for x := 0 to Width - 1 do
begin
r := Round(Line^[x].r * (1 - Kf) + 255 * Kf);
g := Round(Line^[x].g * (1 - Kf) + 255 * Kf);
b := Round(Line^[x].b * (1 - Kf) + 255 * Kf);
CheckRGB(r, g, b);
Line^[x].r := r;
Line^[x].g := g;
Line^[x].b := b;
end;
ScanLines[y] := Line;
end;
FreeMem(Line, Width * 3);
end;
procedure TbsEffectBmp.Invert;
var
x, y, r, g, b: Integer;
Line: PLine;
begin
GetMem(Line, Width * 3);
for y := 0 to Height - 1 do
begin
GetScanLine(y, Line);
for x := 0 to Width - 1 do
begin
r := not Line^[x].r;
g := not Line^[x].g;
b := not Line^[x].b;
CheckRGB(r, g, b);
Line^[x].r := r;
Line^[x].g := g;
Line^[x].b := b;
end;
ScanLines[y] := Line;
end;
FreeMem(Line, Width * 3);
end;
procedure TbsEffectBmp.ChangeDarkness(Kf: Double);
var
x, y, r, g, b: Integer;
Line: PLine;
begin
if Kf < 0 then Kf := 0 else if Kf > 1 then Kf := 1;
GetMem(Line, Width * 3);
for y := 0 to Height - 1 do
begin
GetScanLine(y, Line);
for x := 0 to Width - 1 do
begin
r := Round(Line^[x].r * (1 - Kf));
g := Round(Line^[x].g * (1 - Kf));
b := Round(Line^[x].b * (1 - Kf));
CheckRGB(r, g, b);
Line^[x].r := r;
Line^[x].g := g;
Line^[x].b := b;
end;
ScanLines[y] := Line;
end;
FreeMem(Line, Width * 3);
end;
procedure TbsEffectBmp.GrayScale;
var
x, y: Integer;
Line: PLine;
Gray: Byte;
begin
GetMem(Line, Width * 3);
for y := 0 to Height - 1 do
begin
GetScanLine(y, Line);
for x := 0 to Width - 1 do
begin
Gray := Round(Line^[x].r * 0.3 + Line^[x].g * 0.59 + Line^[x].b * 0.11);
if Gray > 255 then Gray := 255 else if Gray < 0 then Gray := 0;
Line^[x].r := Gray;
Line^[x].g := Gray;
Line^[x].b := Gray;
end;
ScanLines[y] := Line;
end;
FreeMem(Line, Width * 3);
end;
procedure TbsEffectBmp.SplitBlur(Amount: Integer);
var
cx, x, y: Integer;
L, L1, L2: PLine;
Buf: array[0..3] of TFColor;
Tmp: TFColor;
begin
if Amount = 0 then Exit;
for y := 0 to Height-1 do
begin
L := ScanLines[y];
if y - Amount < 0
then L1:=ScanLines[y]
else L1:=ScanLines[y - Amount];
if y + Amount < Height
then L2:=ScanLines[y + Amount]
else L2:=ScanLines[Height - y];
for x := 0 to Width - 1 do
begin
if x - Amount < 0 then cx := x else cx := x - Amount;
Buf[0] := L1[cx];
Buf[1] := L2[cx];
if x + Amount < Width then cx := x + Amount else cx := Width - x;
Buf[2] := L1^[cx];
Buf[3] := L2^[cx];
Tmp.r := (Buf[0].r + Buf[1].r + Buf[2].r + Buf[3].r) div 4;
Tmp.g := (Buf[0].g + Buf[1].g + Buf[2].g + Buf[3].g) div 4;
Tmp.b := (Buf[0].b + Buf[1].b + Buf[2].b + Buf[3].b) div 4;
L^[x] := Tmp;
end;
end;
end;
procedure TbsEffectBmp.Mosaic(ASize: Integer);
var
x, y, i, j : Integer;
L1, L2: PLine;
r, g, b : Byte;
begin
y := 0;
repeat
L1 := Scanlines[y];
x := 0;
repeat
j := 1;
repeat
L2 := Scanlines[y];
x := 0;
repeat
r := L1[x].r;
g := L1[x].g;
b := L1[x].b;
i:=1;
repeat
L2[x].r := r;
L2[x].g := g;
L2[x].b := b;
inc(x);
inc(i);
until (x >= Width) or (i > ASize);
until x >= Width;
inc(j);
inc(y);
until ( y >= Height) or (j > ASize);
until (y >= Height) or (x >= Width);
until y >= Height;
end;
procedure TbsEffectBmp.AddMonoNoise(Amount:Integer);
var
x,y,r,g,b,z: Integer;
Line: PLine;
begin
GetMem(Line, Width * 3);
for y := 0 to Height - 1 do
begin
GetScanLine(y,Line);
for x:=0 to Width-1 do
begin
z := Random(Amount) - Amount div 2;
r := Line^[x].r + z;
g := Line^[x].g + z;
b := Line^[x].b + z;
CheckRGB(r, g, b);
Line^[x].r := r;
Line^[x].g := g;
Line^[x].b := b;
end;
ScanLines[y] := Line;
end;
FreeMem(Line, Width * 3);
end;
procedure TbsEffectBmp.AddColorNoise(Amount:Integer);
var
x,y,r,g,b: Integer;
Line: PLine;
begin
GetMem(Line, Width * 3);
for y := 0 to Height - 1 do
begin
GetScanLine(y,Line);
for x:=0 to Width-1 do
begin
r := Line^[x].r + (Random(Amount) - (Amount div 2));
g := Line^[x].g + (Random(Amount) - (Amount div 2));
b := Line^[x].b + (Random(Amount) - (Amount div 2));
CheckRGB(r, g, b);
Line^[x].r := r;
Line^[x].g := g;
Line^[x].b := b;
end;
ScanLines[y] := Line;
end;
FreeMem(Line, Width * 3);
end;
procedure TbsEffectBmp.Rotate90_1(Dst: TbsEffectBmp);
var
x, y: Integer;
begin
for y := 0 to Height - 1 do
for x := 0 to Width - 1 do
Dst.Pixels[y, Width - 1 - x] := Pixels[x, y];
end;
procedure TbsEffectBmp.Rotate90_2(Dst: TbsEffectBmp);
var
x, y: Integer;
begin
for y := 0 to Height - 1 do
for x := 0 to Width - 1 do
Dst.Pixels[Height - 1 - y, x] := Pixels[x, y];
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -