基本图象处理代码(3)

[常用滤镜效果]

这里根据角度的不同,在一个像素周围的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&lt;-135)) or ((AzimuthChange&gt;=90) and (AzimuthChange&lt;=180))) then   
  2begin   
  3Inc(SrcRGB1);   
  4end;   
  5if (j<srcbmp.width (((azimuthchange="" -="" 1)="" not="" or="">=135) and (AzimuthChange&lt;180)) or ((AzimuthChange&gt;=-180) and (AzimuthChange&lt;=-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&lt;128 then   
 56PRGB^.rgbtRed :=not PRGB^.rgbtRed ;   
 57if PRGB^.rgbtGreen&lt;128 then   
 58PRGB^.rgbtGreen :=not PRGB^.rgbtGreen;   
 59if PRGB^.rgbtBlue&lt;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 &gt; 0 then   
 93SrcPreRow:=SrcBmp.ScanLine[i-1]   
 94else   
 95SrcPreRow := SrcBmp.ScanLine[i];   
 96SrcRow := SrcBmp.ScanLine[i];   
 97if i &lt; 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 &gt; 0 then DecRow;   
104Value:=SrcPreRow.rgbtRed+SrcRow.rgbtRed+SrcNextRow.rgbtRed;   
105if j &gt; 0 then IncRow;   
106Value:=Value+SrcPreRow.rgbtRed+SrcRow.rgbtRed+SrcNextRow.rgbtRed;   
107if j &lt; SrcBmp.Width - 1 then IncRow;   
108Value:=(Value+SrcPreRow.rgbtRed+SrcRow.rgbtRed+SrcNextRow.rgbtRed) div 9;   
109if j &lt; SrcBmp.Width - 1 then DecRow;   
110SrcRow.rgbtRed:=value;   
111if j &gt; 0 then DecRow;   
112Value:=SrcPreRow.rgbtGreen+SrcRow.rgbtGreen+SrcNextRow.rgbtGreen;   
113if j &gt; 0 then IncRow;   
114Value:=Value+SrcPreRow.rgbtGreen+SrcRow.rgbtGreen+SrcNextRow.rgbtGreen;   
115if j &lt; SrcBmp.Width - 1 then IncRow;   
116Value:=(Value+SrcPreRow.rgbtGreen+SrcRow.rgbtGreen+SrcNextRow.rgbtGreen) div 9;   
117if j &lt; SrcBmp.Width - 1 then DecRow;   
118SrcRow.rgbtGreen:=value;   
119if j &gt; 0 then DecRow;   
120Value:=SrcPreRow.rgbtBlue+SrcRow.rgbtBlue+SrcNextRow.rgbtBlue;   
121if j &gt; 0 then IncRow;   
122Value:=Value+SrcPreRow.rgbtBlue+SrcRow.rgbtBlue+SrcNextRow.rgbtBlue;   
123if j &lt; SrcBmp.Width - 1 then IncRow;   
124Value:=(Value+SrcPreRow.rgbtBlue+SrcRow.rgbtBlue+SrcNextRow.rgbtBlue) div 9;   
125if j &lt; 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 &gt; 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>
Published At
Categories with Web编程
comments powered by Disqus