[常用滤镜效果]
这里根据角度的不同,在一个像素周围的8个像素中取不同的两个运算得到新颜色值,用这个值和它求差值实现浮雕效果。
//浮雕
procedure Emboss(SrcBmp,DestBmp:TBitmap;AzimuthChange:integer);overload;
var
i, j, Gray, Azimuthvalue, R, G, B: integer;
SrcRGB, SrcRGB1, SrcRGB2, DestRGB: pRGBTriple;
begin
for i := 0 to SrcBmp.Height - 1 do
begin
SrcRGB := SrcBmp.ScanLine[i];
DestRGB := DestBmp.ScanLine[i];
if (AzimuthChange >= -180) and (AzimuthChange < -135) then
begin
if i > 0 then
SrcRGB1 := SrcBmp.ScanLine[i-1]
else
SrcRGB1 := SrcRGB;
Inc(SrcRGB1);
SrcRGB2 := SrcRGB;
Inc(SrcRGB2);
end
else if (AzimuthChange >= -135) and (AzimuthChange < -90) then
begin
if i > 0 then
SrcRGB1 := SrcBmp.ScanLine[i-1]
else
SrcRGB1 := SrcRGB;
SrcRGB2 := SrcRGB1;
Inc(SrcRGB2);
end
else if (AzimuthChange >= -90) and (AzimuthChange < -45) then
begin
if i > 0 then
SrcRGB1 := SrcBmp.ScanLine[i-1]
else
SrcRGB1 := SrcRGB;
SrcRGB2 := SrcRGB1;
end
else if (AzimuthChange >= -45) and (AzimuthChange < 0) then
begin
SrcRGB1 := SrcRGB;
if i > 0 then
SrcRGB2 := SrcBmp.ScanLine[i-1]
else
SrcRGB2 := SrcRGB;
end
else if (AzimuthChange >= 0) and (AzimuthChange < 45) then
begin
SrcRGB2 := SrcRGB;
if (i < SrcBmp.Height - 1) then
SrcRGB1 := SrcBmp.ScanLine[i+1]
else
SrcRGB1 := SrcRGB;
end
else if (AzimuthChange >= 45) and (AzimuthChange < 90) then
begin
if (i < SrcBmp.Height - 1) then
SrcRGB1 := SrcBmp.ScanLine[i+1]
else
SrcRGB1 := SrcRGB;
SrcRGB2 := SrcRGB1;
end
else if (AzimuthChange >= 90) and (AzimuthChange < 135) then
begin
if (i < SrcBmp.Height - 1) then
SrcRGB1 := SrcBmp.ScanLine[i+1]
else
SrcRGB1 := SrcRGB;
SrcRGB2 := SrcRGB1;
Inc(SrcRGB1);
end
else if (AzimuthChange >= 135) and (AzimuthChange <= 180) then
begin
if (i < SrcBmp.Height - 1) then
SrcRGB2 := SrcBmp.ScanLine[i+1]
else
SrcRGB2 := SrcRGB;
Inc(SrcRGB2);
SrcRGB1 := SrcRGB;
Inc(SrcRGB1);
end;
for j := 0 to SrcBmp.Width - 1 do
begin
if (AzimuthChange >= -180) and (AzimuthChange < -135) then
begin
Azimuthvalue := AzimuthChange + 180;
R:=SrcRGB.rgbtRed-((SrcRGB1.rgbtRed)Azimuthvalue div 45)-((SrcRGB2.rgbtRed)(45-Azimuthvalue) div 45)+78;
G:=SrcRGB.rgbtGreen-((SrcRGB1.rgbtGreen)Azimuthvalue div 45)-((SrcRGB2.rgbtGreen)(45-Azimuthvalue) div 45)+78;
B:=SrcRGB.rgbtBlue-((SrcRGB1.rgbtBlue)Azimuthvalue div 45)-((SrcRGB2.rgbtBlue)(45-Azimuthvalue) div 45)+78;
end
else if (AzimuthChange >= -135) and (AzimuthChange < -90) then
begin
Azimuthvalue := AzimuthChange + 135;
R:=SrcRGB.rgbtRed-((SrcRGB1.rgbtRed)Azimuthvalue div 45)-((SrcRGB2.rgbtRed)(45-Azimuthvalue) div 45)+78;
G:=SrcRGB.rgbtGreen-((SrcRGB1.rgbtGreen)Azimuthvalue div 45)-((SrcRGB2.rgbtGreen)(45-Azimuthvalue) div 45)+78;
B:=SrcRGB.rgbtBlue-((SrcRGB1.rgbtBlue)Azimuthvalue div 45)-((SrcRGB2.rgbtBlue)(45-Azimuthvalue) div 45)+78;
end
else if (AzimuthChange >= -90) and (AzimuthChange < -45) then
begin
if j=1 then Dec(SrcRGB1);
Azimuthvalue := AzimuthChange + 90;
R:=SrcRGB.rgbtRed-((SrcRGB1.rgbtRed)Azimuthvalue div 45)-((SrcRGB2.rgbtRed)(45-Azimuthvalue) div 45)+78;
G:=SrcRGB.rgbtGreen-((SrcRGB1.rgbtGreen)Azimuthvalue div 45)-((SrcRGB2.rgbtGreen)(45-Azimuthvalue) div 45)+78;
B:=SrcRGB.rgbtBlue-((SrcRGB1.rgbtBlue)Azimuthvalue div 45)-((SrcRGB2.rgbtBlue)(45-Azimuthvalue) div 45)+78;
end
else if (AzimuthChange >= -45) and (AzimuthChange < 0) then
begin
if j=1 then
begin
Dec(SrcRGB1);
Dec(SrcRGB2);
end;
Azimuthvalue := AzimuthChange + 45;
R:=SrcRGB.rgbtRed-((SrcRGB1.rgbtRed)Azimuthvalue div 45)-((SrcRGB2.rgbtRed)(45-Azimuthvalue) div 45)+78;
G:=SrcRGB.rgbtGreen-((SrcRGB1.rgbtGreen)Azimuthvalue div 45)-((SrcRGB2.rgbtGreen)(45-Azimuthvalue) div 45)+78;
B:=SrcRGB.rgbtBlue-((SrcRGB1.rgbtBlue)Azimuthvalue div 45)-((SrcRGB2.rgbtBlue)(45-Azimuthvalue) div 45)+78;
end
else if (AzimuthChange >= 0) and (AzimuthChange < 45) then
begin
if j=1 then
begin
Dec(SrcRGB1);
Dec(SrcRGB2);
end;
Azimuthvalue := AzimuthChange;
R:=SrcRGB.rgbtRed-((SrcRGB1.rgbtRed)Azimuthvalue div 45)-((SrcRGB2.rgbtRed)(45-Azimuthvalue) div 45)+78;
G:=SrcRGB.rgbtGreen-((SrcRGB1.rgbtGreen)Azimuthvalue div 45)-((SrcRGB2.rgbtGreen)(45-Azimuthvalue) div 45)+78;
B:=SrcRGB.rgbtBlue-((SrcRGB1.rgbtBlue)Azimuthvalue div 45)-((SrcRGB2.rgbtBlue)(45-Azimuthvalue) div 45)+78;
end
else if (AzimuthChange >= 45) and (AzimuthChange < 90) then
begin
if j=1 then Dec(SrcRGB2);
Azimuthvalue := AzimuthChange - 45;
R:=SrcRGB.rgbtRed-((SrcRGB1.rgbtRed)Azimuthvalue div 45)-((SrcRGB2.rgbtRed)(45-Azimuthvalue) div 45)+78;
G:=SrcRGB.rgbtGreen-((SrcRGB1.rgbtGreen)Azimuthvalue div 45)-((SrcRGB2.rgbtGreen)(45-Azimuthvalue) div 45)+78;
B:=SrcRGB.rgbtBlue-((SrcRGB1.rgbtBlue)Azimuthvalue div 45)-((SrcRGB2.rgbtBlue)(45-Azimuthvalue) div 45)+78;
end
else if (AzimuthChange >= 90) and (AzimuthChange < 135) then
begin
Azimuthvalue := AzimuthChange - 90;
R:=SrcRGB.rgbtRed-((SrcRGB1.rgbtRed)Azimuthvalue div 45)-((SrcRGB2.rgbtRed)(45-Azimuthvalue) div 45)+78;
G:=SrcRGB.rgbtGreen-((SrcRGB1.rgbtGreen)Azimuthvalue div 45)-((SrcRGB2.rgbtGreen)(45-Azimuthvalue) div 45)+78;
B:=SrcRGB.rgbtBlue-((SrcRGB1.rgbtBlue)Azimuthvalue div 45)-((SrcRGB2.rgbtBlue)(45-Azimuthvalue) div 45)+78;
end
else if (AzimuthChange >= 135) and (AzimuthChange <= 180) then
begin
Azimuthvalue := AzimuthChange - 135;
R:=SrcRGB.rgbtRed-((SrcRGB1.rgbtRed)Azimuthvalue div 45)-((SrcRGB2.rgbtRed)(45-Azimuthvalue) div 45)+78;
G:=SrcRGB.rgbtGreen-((SrcRGB1.rgbtGreen)Azimuthvalue div 45)-((SrcRGB2.rgbtGreen)(45-Azimuthvalue) div 45)+78;
B:=SrcRGB.rgbtBlue-((SrcRGB1.rgbtBlue)Azimuthvalue div 45)-((SrcRGB2.rgbtBlue)(45-Azimuthvalue) div 45)+78;
end;
R:=Min(R,255);
R:=Max(R,0);
G:=Min(G,255);
G:=Max(G,0);
B:=Min(B,255);
B:=Max(B,0);
Gray := (R shr 2) + (R shr 4) + (G shr 1) + (G shr 4) + (B shr 3);
DestRGB.rgbtRed:=Gray;
DestRGB.rgbtGreen:=Gray;
DestRGB.rgbtBlue:=Gray;
if (j
1<srcbmp.width (((azimuthchange="" -="" 1)="" not="" or="">=-180) and (AzimuthChange<-135)) or ((AzimuthChange>=90) and (AzimuthChange<=180))) then
2begin
3Inc(SrcRGB1);
4end;
5if (j<srcbmp.width (((azimuthchange="" -="" 1)="" not="" or="">=135) and (AzimuthChange<180)) or ((AzimuthChange>=-180) and (AzimuthChange<=-90))) then
6begin
7Inc(SrcRGB2);
8end;
9Inc(SrcRGB);
10Inc(DestRGB);
11end;
12end;
13end;
14
15procedure Emboss(Bmp:TBitmap;AzimuthChange:integer;ElevationChange:integer;WeightChange:integer);overload;
16var
17DestBmp:TBitmap;
18begin
19DestBmp:=TBitmap.Create;
20DestBmp.Assign(Bmp);
21Emboss(Bmp,DestBmp,AzimuthChange,ElevationChange,WeightChange);
22Bmp.Assign(DestBmp);
23end;
24
25//反色
26procedure Negative(Bmp:TBitmap);
27var
28i, j: Integer;
29PRGB: pRGBTriple;
30begin
31for i := 0 to Bmp.Height - 1 do
32begin
33PRGB := Bmp.ScanLine[i];
34for j := 0 to Bmp.Width - 1 do
35begin
36PRGB^.rgbtRed :=not PRGB^.rgbtRed ;
37PRGB^.rgbtGreen :=not PRGB^.rgbtGreen;
38PRGB^.rgbtBlue :=not PRGB^.rgbtBlue;
39Inc(PRGB);
40end;
41end;
42end;
43
44//曝光
45procedure Exposure(Bmp:TBitmap);
46var
47i, j: integer;
48PRGB: pRGBTriple;
49begin
50for i := 0 to Bmp.Height - 1 do
51begin
52PRGB := Bmp.ScanLine[i];
53for j := 0 to Bmp.Width - 1 do
54begin
55if PRGB^.rgbtRed<128 then
56PRGB^.rgbtRed :=not PRGB^.rgbtRed ;
57if PRGB^.rgbtGreen<128 then
58PRGB^.rgbtGreen :=not PRGB^.rgbtGreen;
59if PRGB^.rgbtBlue<128 then
60PRGB^.rgbtBlue :=not PRGB^.rgbtBlue;
61Inc(PRGB);
62end;
63end;
64end;
65
66//模糊
67procedure Blur(SrcBmp:TBitmap);
68var
69i, j:Integer;
70SrcRow:pRGBTriple;
71SrcNextRow:pRGBTriple;
72SrcPreRow:pRGBTriple;
73Value:Integer;
74
75procedure IncRow;
76begin
77Inc(SrcPreRow);
78Inc(SrcRow);
79Inc(SrcNextRow);
80end;
81
82procedure DecRow;
83begin
84Dec(SrcPreRow);
85Dec(SrcRow);
86Dec(SrcNextRow);
87end;
88
89begin
90for i := 0 to SrcBmp.Height - 1 do
91begin
92if i > 0 then
93SrcPreRow:=SrcBmp.ScanLine[i-1]
94else
95SrcPreRow := SrcBmp.ScanLine[i];
96SrcRow := SrcBmp.ScanLine[i];
97if i < SrcBmp.Height - 1 then
98SrcNextRow:=SrcBmp.ScanLine[i+1]
99else
100SrcNextRow:=SrcBmp.ScanLine[i];
101for j := 0 to SrcBmp.Width - 1 do
102begin
103if j > 0 then DecRow;
104Value:=SrcPreRow.rgbtRed+SrcRow.rgbtRed+SrcNextRow.rgbtRed;
105if j > 0 then IncRow;
106Value:=Value+SrcPreRow.rgbtRed+SrcRow.rgbtRed+SrcNextRow.rgbtRed;
107if j < SrcBmp.Width - 1 then IncRow;
108Value:=(Value+SrcPreRow.rgbtRed+SrcRow.rgbtRed+SrcNextRow.rgbtRed) div 9;
109if j < SrcBmp.Width - 1 then DecRow;
110SrcRow.rgbtRed:=value;
111if j > 0 then DecRow;
112Value:=SrcPreRow.rgbtGreen+SrcRow.rgbtGreen+SrcNextRow.rgbtGreen;
113if j > 0 then IncRow;
114Value:=Value+SrcPreRow.rgbtGreen+SrcRow.rgbtGreen+SrcNextRow.rgbtGreen;
115if j < SrcBmp.Width - 1 then IncRow;
116Value:=(Value+SrcPreRow.rgbtGreen+SrcRow.rgbtGreen+SrcNextRow.rgbtGreen) div 9;
117if j < SrcBmp.Width - 1 then DecRow;
118SrcRow.rgbtGreen:=value;
119if j > 0 then DecRow;
120Value:=SrcPreRow.rgbtBlue+SrcRow.rgbtBlue+SrcNextRow.rgbtBlue;
121if j > 0 then IncRow;
122Value:=Value+SrcPreRow.rgbtBlue+SrcRow.rgbtBlue+SrcNextRow.rgbtBlue;
123if j < SrcBmp.Width - 1 then IncRow;
124Value:=(Value+SrcPreRow.rgbtBlue+SrcRow.rgbtBlue+SrcNextRow.rgbtBlue) div 9;
125if j < SrcBmp.Width - 1 then DecRow;
126SrcRow.rgbtBlue:=value;
127IncRow;
128end;
129end;
130end;
131
132//锐化
133procedure Sharpen(SrcBmp:TBitmap);
134var
135i, j: integer;
136SrcRGB: pRGBTriple;
137SrcPreRGB: pRGBTriple;
138Value: integer;
139begin
140for i := 0 to SrcBmp.Height - 1 do
141begin
142SrcRGB := SrcBmp.ScanLine[i];
143if i > 0 then
144SrcPreRGB:=SrcBmp.ScanLine[i-1]
145else
146SrcPreRGB:=SrcBmp.ScanLine[i];
147for j := 0 to SrcBmp.Width - 1 do
148begin
149if j = 1 then Dec(SrcPreRGB);
150Value:=SrcRGB.rgbtRed+(SrcRGB.rgbtRed-SrcPreRGB.rgbtRed) div 2;
151Value:=Max(0,Value);
152Value:=Min(255,Value);
153SrcRGB.rgbtRed:=value;
154Value:=SrcRGB.rgbtGreen+(SrcRGB.rgbtGreen-SrcPreRGB.rgbtGreen) div 2;
155Value:=Max(0,Value);
156Value:=Min(255,Value);
157SrcRGB.rgbtGreen:=value;
158Value:=SrcRGB.rgbtBlue+(SrcRGB.rgbtBlue-SrcPreRGB.rgbtBlue) div 2;
159Value:=Max(0,Value);
160Value:=Min(255,Value);
161SrcRGB.rgbtBlue:=value;
162Inc(SrcRGB);
163Inc(SrcPreRGB);
164end;
165end;
166end;</srcbmp.width></srcbmp.width>