📄 unit3.pas
字号:
dec(integer(SrcRow), ScanlineBytes);
AProgressBar.Position:=i;
end;
end;
//曝光
procedure Exposure(SrcBmp:Tbitmap;AProgressBar:TProgressBar);
var
i, j: integer;
SrcRow: pRGBArray;
begin
AProgressBar.Max:=SrcBmp.Height - 1;
for i := 0 to SrcBmp.Height - 1 do
begin
SrcRow := SrcBmp.ScanLine[i];
//DestRow := DestBmp.ScanLine[i];
// for each pixel in row
for j := 0 to SrcBmp.Width - 1 do
begin
// add brightness value to pixel's RGB values
// RGB values must be less than 256
if SrcRow[j].rgbtRed<128 then
SrcRow[j].rgbtRed :=not SrcRow[j].rgbtRed ;
if SrcRow[j].rgbtGreen<128 then
SrcRow[j].rgbtGreen :=not SrcRow[j].rgbtGreen;
if SrcRow[j].rgbtBlue<128 then
SrcRow[j].rgbtBlue :=not SrcRow[j].rgbtBlue;
end;
AProgressBar.Position:=i;
end;
end;
//浮雕
procedure Emboss(SrcBmp:Tbitmap;AProgressBar:TProgressBar);
var
i, j: integer;
SrcRow: pRGBArray;
SrcNextRow:pRGBArray;
Value:integer;
begin
AProgressBar.Max:=SrcBmp.Height - 2;
for i := 0 to SrcBmp.Height - 2 do
begin
SrcRow := SrcBmp.ScanLine[i];
SrcNextRow:=SrcBmp.ScanLine[i+1];
//DestRow := DestBmp.ScanLine[i];
// for each pixel in row
for j := 0 to SrcBmp.Width - 1 do
begin
// add brightness value to pixel's RGB values
// RGB values must be less than 256
Value:=SrcRow[j].rgbtRed-SrcNextRow[j+1].rgbtRed+128;
Value:=Max(0,Value);
Value:=Min(255,Value);
SrcRow[j].rgbtRed:=value;
Value:=SrcRow[j].rgbtGreen -SrcNextRow[j+1].rgbtGreen+128;
Value:=Max(0,Value);
Value:=Min(255,Value);
SrcRow[j].rgbtGreen:=value;
Value:=SrcRow[j].rgbtBlue-SrcNextRow[j+1].rgbtBlue+128;
Value:=Max(0,Value);
Value:=Min(255,Value);
SrcRow[j].rgbtBlue:=value;
end;
AProgressBar.Position:=i;
end;
end;
//雕刻
procedure Engrave(SrcBmp:Tbitmap;AProgressBar:TProgressBar);
var
i, j: integer;
SrcRow: pRGBArray;
SrcNextRow:pRGBArray;
Value:integer;
begin
AProgressBar.Max:=SrcBmp.Height - 2;
for i := 0 to SrcBmp.Height - 2 do
begin
SrcRow := SrcBmp.ScanLine[i];
SrcNextRow:=SrcBmp.ScanLine[i+1];
//DestRow := DestBmp.ScanLine[i];
// for each pixel in row
for j := 0 to SrcBmp.Width - 1 do
begin
// add brightness value to pixel's RGB values
// RGB values must be less than 256
Value:=SrcNextRow[j+1].rgbtRed-SrcRow[j].rgbtRed+128;
Value:=Max(0,Value);
Value:=Min(255,Value);
SrcRow[j].rgbtRed:=value;
Value:=SrcNextRow[j+1].rgbtGreen-SrcRow[j].rgbtGreen+128;
Value:=Max(0,Value);
Value:=Min(255,Value);
SrcRow[j].rgbtGreen:=value;
Value:=SrcNextRow[j+1].rgbtBlue-SrcRow[j].rgbtBlue+128;
Value:=Max(0,Value);
Value:=Min(255,Value);
SrcRow[j].rgbtBlue:=value;
end;
AProgressBar.Position:=i;
end;
end;
//模糊
procedure Blur(SrcBmp:Tbitmap;AProgressBar:TProgressBar);
var
i, j: integer;
SrcRow: pRGBArray;
SrcNextRow:pRGBArray;
SrcPreRow:pRGBArray;
Value:integer;
begin
AProgressBar.Max:=SrcBmp.Height - 2;
for i := 1 to SrcBmp.Height - 2 do
begin
SrcRow := SrcBmp.ScanLine[i];
SrcPreRow:=SrcBmp.ScanLine[i-1];
SrcNextRow:=SrcBmp.ScanLine[i+1];
//DestRow := DestBmp.ScanLine[i];
// for each pixel in row
for j := 1 to SrcBmp.Width - 1 do
begin
// add brightness value to pixel's RGB values
// RGB values must be less than 256
Value:=(SrcPreRow[j-1].rgbtRed+SrcRow[j-1].rgbtRed+SrcNextRow[j-1].rgbtRed+
SrcPreRow[j].rgbtRed+SrcRow[j].rgbtRed+SrcNextRow[j].rgbtRed+
SrcPreRow[j+1].rgbtRed+SrcRow[j+1].rgbtRed+SrcNextRow[j+1].rgbtRed)div 9;
SrcRow[j].rgbtRed:=value;
Value:=(SrcPreRow[j-1].rgbtGreen+SrcRow[j-1].rgbtGreen+SrcNextRow[j-1].rgbtGreen+
SrcPreRow[j].rgbtGreen+SrcRow[j].rgbtGreen+SrcNextRow[j].rgbtGreen+
SrcPreRow[j+1].rgbtGreen+SrcRow[j+1].rgbtGreen+SrcNextRow[j+1].rgbtGreen)div 9;
SrcRow[j].rgbtGreen:=value;
Value:=(SrcPreRow[j-1].rgbtBlue+SrcRow[j-1].rgbtBlue+SrcNextRow[j-1].rgbtBlue+
SrcPreRow[j].rgbtBlue+SrcRow[j].rgbtBlue+SrcNextRow[j].rgbtBlue+
SrcPreRow[j+1].rgbtBlue+SrcRow[j+1].rgbtBlue+SrcNextRow[j+1].rgbtBlue)div 9;
SrcRow[j].rgbtBlue:=value;
end;
AProgressBar.Position:=i;
end;
end;
//锐化
procedure Sharpen(SrcBmp:Tbitmap;AProgressBar:TProgressBar);
var
i, j: integer;
SrcRow: pRGBArray;
SrcPreRow:pRGBArray;
Value:integer;
begin
AProgressBar.Max:=SrcBmp.Height - 1;
for i := 1 to SrcBmp.Height - 1 do
begin
SrcRow := SrcBmp.ScanLine[i];
SrcPreRow:=SrcBmp.ScanLine[i-1];
//DestRow := DestBmp.ScanLine[i];
// for each pixel in row
for j := 0 to SrcBmp.Width - 1 do
begin
// add brightness value to pixel's RGB values
// RGB values must be less than 256
Value:=SrcRow[j].rgbtRed+(SrcRow[j].rgbtRed-SrcPreRow[j-1].rgbtRed)div 2;
Value:=Max(0,Value);
Value:=Min(255,Value);
SrcRow[j].rgbtRed:=value;
Value:=SrcRow[j].rgbtGreen+(SrcRow[j].rgbtGreen-SrcPreRow[j-1].rgbtGreen)div 2;
Value:=Max(0,Value);
Value:=Min(255,Value);
SrcRow[j].rgbtGreen:=value;
Value:=SrcRow[j].rgbtBlue+(SrcRow[j].rgbtBlue-SrcPreRow[j-1].rgbtBlue)div 2;
Value:=Max(0,Value);
Value:=Min(255,Value);
SrcRow[j].rgbtBlue:=value;
end;
AProgressBar.Position:=i;
end;
end;
//紫色滤镜
procedure Purple(SrcBmp:Tbitmap;AProgressBar:TProgressBar);
var
i, j: integer;
SrcRow: pRGBArray;
ScanlineBytes:integer;
begin
ScanlineBytes:=SrcBmp.Width*3;
SrcRow := SrcBmp.ScanLine[0];
AProgressBar.Max:=SrcBmp.Height - 1;
for i := 0 to SrcBmp.Height - 1 do
begin
for j := 0 to SrcBmp.Width - 1 do
begin
SrcRow[j].rgbtRed :=(SrcRow[j].rgbtGreen+SrcRow[j].rgbtRed)div 2;
SrcRow[j].rgbtGreen :=(SrcRow[j].rgbtBlue+SrcRow[j].rgbtGreen)div 2;
SrcRow[j].rgbtBlue :=(SrcRow[j].rgbtRed+SrcRow[j].rgbtBlue)div 2;
end;
dec(integer(SrcRow), ScanlineBytes);
AProgressBar.Position:=i;
end;
end;
procedure Spooky(SrcBmp:Tbitmap;AProgressBar:TProgressBar);
var
i, j: integer;
SrcRow: pRGBArray;
ScanlineBytes:integer;
begin
ScanlineBytes:=SrcBmp.Width*3;
SrcRow := SrcBmp.ScanLine[0];
AProgressBar.Max:=SrcBmp.Height - 1;
for i := 0 to SrcBmp.Height - 1 do
begin
for j := 0 to SrcBmp.Width - 1 do
begin
// SrcRow[j].rgbtRed :=(SrcRow[j].rgbtGreen+SrcRow[j].rgbtRed)div 2;
SrcRow[j].rgbtGreen :=(SrcRow[j].rgbtRed+SrcRow[j].rgbtGreen)div 2;
SrcRow[j].rgbtBlue :=(SrcRow[j].rgbtRed+SrcRow[j].rgbtBlue)div 2;
end;
dec(integer(SrcRow), ScanlineBytes);
AProgressBar.Position:=i;
end;
end;
procedure OtherEffect(SrcBmp:Tbitmap;EffectIndex:integer;AProgressBar:TProgressBar);
var
i, j: integer;
c:integer;
SrcRow: pRGBArray;
ScanlineBytes:integer;
begin
ScanlineBytes:=SrcBmp.Width*3;
SrcRow := SrcBmp.ScanLine[0];
AProgressBar.Max:=SrcBmp.Height - 1;
for i := 0 to SrcBmp.Height - 1 do
begin
for j := 0 to SrcBmp.Width - 1 do
begin
case EffectIndex of
0:
begin
SrcRow[j].rgbtGreen :=(SrcRow[j].rgbtRed+SrcRow[j].rgbtGreen)div 2;
SrcRow[j].rgbtRed:=SrcRow[j].rgbtGreen;
SrcRow[j].rgbtBlue :=trunc(SrcRow[j].rgbtBlue*(arctan(SrcRow[j].rgbtGreen)*2));
end;
1:
begin
SrcRow[j].rgbtGreen :=(SrcRow[j].rgbtRed+SrcRow[j].rgbtGreen)div 2;
SrcRow[j].rgbtRed:=SrcRow[j].rgbtGreen;
end;
2:
begin
SrcRow[j].rgbtRed :=(SrcRow[j].rgbtRed+SrcRow[j].rgbtBlue)div 2;
SrcRow[j].rgbtBlue:=SrcRow[j].rgbtRed;
end;
3:
begin
SrcRow[j].rgbtGreen :=(SrcRow[j].rgbtGreen+SrcRow[j].rgbtBlue)div 2;
SrcRow[j].rgbtBlue:=SrcRow[j].rgbtGreen;
end;
4:
begin
SrcRow[j].rgbtGreen :=(SrcRow[j].rgbtGreen+SrcRow[j].rgbtBlue)div 2;
SrcRow[j].rgbtBlue:=SrcRow[j].rgbtGreen;
SrcRow[j].rgbtRed:=trunc(SrcRow[j].rgbtRed*(arctan(SrcRow[j].rgbtGreen)*2));
end;
5:
begin
SrcRow[j].rgbtBlue :=(SrcRow[j].rgbtBlue+SrcRow[j].rgbtRed)div 2;
SrcRow[j].rgbtRed:=SrcRow[j].rgbtBlue;
SrcRow[j].rgbtGreen:=trunc(SrcRow[j].rgbtGreen*(arctan(SrcRow[j].rgbtRed)*2));
end;
6:
begin
SrcRow[j].rgbtBlue := trunc(Sin(SrcRow[j].rgbtBlue) * SrcRow[j].rgbtBlue);
SrcRow[j].rgbtRed := trunc(Sin(SrcRow[j].rgbtRed) * SrcRow[j].rgbtRed);
SrcRow[j].rgbtGreen := trunc(Sin(SrcRow[j].rgbtGreen) * SrcRow[j].rgbtGreen);
end;
7:
begin
C := (SrcRow[j].rgbtRed + SrcRow[j].rgbtGreen + SrcRow[j].rgbtBlue) div 12;
SrcRow[j].rgbtBlue := trunc(Abs(Not (SrcRow[j].rgbtGreen + C)));
SrcRow[j].rgbtRed := trunc(Abs(Not (SrcRow[j].rgbtBlue + C)));
SrcRow[j].rgbtGreen := trunc(Abs(Not (SrcRow[j].rgbtRed + C)));
end;
8:
begin
SrcRow[j].rgbtRed := SrcRow[j].rgbtRed div 2;
SrcRow[j].rgbtBlue := SrcRow[j].rgbtGreen div 2;
SrcRow[j].rgbtGreen := SrcRow[j].rgbtRed;
end;
9:
begin
SrcRow[j].rgbtRed := SrcRow[j].rgbtRed;
SrcRow[j].rgbtBlue := SrcRow[j].rgbtGreen div 2;
SrcRow[j].rgbtGreen := SrcRow[j].rgbtRed div 2;
end;
10:
begin
SrcRow[j].rgbtRed := SrcRow[j].rgbtRed + trunc(Abs(Sin(SrcRow[j].rgbtRed) * 64));
SrcRow[j].rgbtGreen := SrcRow[j].rgbtGreen + trunc(Abs(Sin(SrcRow[j].rgbtGreen) * 64));
SrcRow[j].rgbtBlue := SrcRow[j].rgbtBlue + trunc(Abs(Sin(SrcRow[j].rgbtBlue) * 64));
end;
11:
begin
SrcRow[j].rgbtBlue := SrcRow[j].rgbtGreen;
SrcRow[j].rgbtGreen := SrcRow[j].rgbtRed;
end;
12:
begin
SrcRow[j].rgbtRed := SrcRow[j].rgbtGreen;
SrcRow[j].rgbtGreen := SrcRow[j].rgbtBlue;
end;
13:
begin
SrcRow[j].rgbtGreen := SrcRow[j].rgbtRed;
SrcRow[j].rgbtRed := SrcRow[j].rgbtBlue;
end;
14:
begin
SrcRow[j].rgbtBlue := SrcRow[j].rgbtRed;
SrcRow[j].rgbtRed := SrcRow[j].rgbtBlue;
end;
15:
begin
SrcRow[j].rgbtBlue := SrcRow[j].rgbtRed;
end;
16:
begin
SrcRow[j].rgbtGreen := SrcRow[j].rgbtRed;
end;
17:
begin
SrcRow[j].rgbtRed := SrcRow[j].rgbtGreen;
end;
18:
begin
SrcRow[j].rgbtBlue := SrcRow[j].rgbtGreen;
end;
19:
begin
SrcRow[j].rgbtRed := SrcRow[j].rgbtBlue;
end;
20:
begin
SrcRow[j].rgbtGreen := SrcRow[j].rgbtBlue;
end;
end;//end case
end;
dec(integer(SrcRow), ScanlineBytes);
AProgressBar.Position:=i;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -