• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Delphi基本图像处理方法汇总

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
这篇文章主要介绍了Delphi基本图像处理方法,实例汇总了Delphi操作图像实现浮雕、反色、模糊、翻转等常用效果的方法,非常具有实用价值,需要的朋友可以参考下
 

本文实例汇总了Delphi基本图像处理方法。分享给大家供大家参考。具体分析如下:

//浮雕
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 Inc(SrcRGB1,-1);
    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
     Inc(SrcRGB1,-1);
     Inc(SrcRGB2,-1);
    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
     Inc(SrcRGB1,-1);
     Inc(SrcRGB2,-1);
    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 Inc(SrcRGB2,-1);
    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=-180) and (AzimuthChange<-135)) or ((AzimuthChange>=90) and (AzimuthChange<=180))) then
   begin
    Inc(SrcRGB1);
   end;
   if (j=135) and (AzimuthChange<180)) or ((AzimuthChange>=-180) and (AzimuthChange<=-90))) then
   begin
    Inc(SrcRGB2);
   end;
   Inc(SrcRGB);
   Inc(DestRGB);
  end;
 end;
end;
procedure Emboss(Bmp:TBitmap;AzimuthChange:integer;ElevationChange:integer;WeightChange:integer);overload;
var
 DestBmp:TBitmap;
begin
  DestBmp:=TBitmap.Create;
  DestBmp.Assign(Bmp);
  Emboss(Bmp,DestBmp,AzimuthChange,ElevationChange,WeightChange);
  Bmp.Assign(DestBmp);
end;
//反色
procedure Negative(Bmp:TBitmap);
var
 i, j: Integer;
 PRGB: pRGBTriple;
begin
 Bmp.PixelFormat:=pf24Bit;
 for i := 0 to Bmp.Height - 1 do
 begin
  PRGB := Bmp.ScanLine[i];
  for j := 0 to Bmp.Width - 1 do
  begin
   PRGB^.rgbtRed :=not PRGB^.rgbtRed ;
   PRGB^.rgbtGreen :=not PRGB^.rgbtGreen;
   PRGB^.rgbtBlue :=not PRGB^.rgbtBlue;
   Inc(PRGB);
  end;
 end;
end;
//曝光
procedure Exposure(Bmp:TBitmap);
var
 i, j: integer;
 PRGB: pRGBTriple;
begin
 Bmp.PixelFormat:=pf24Bit;
 for i := 0 to Bmp.Height - 1 do
 begin
  PRGB := Bmp.ScanLine[i];
  for j := 0 to Bmp.Width - 1 do
  begin
   if PRGB^.rgbtRed<128 then
    PRGB^.rgbtRed :=not PRGB^.rgbtRed ;
   if PRGB^.rgbtGreen<128 then
    PRGB^.rgbtGreen :=not PRGB^.rgbtGreen;
   if PRGB^.rgbtBlue<128 then
    PRGB^.rgbtBlue :=not PRGB^.rgbtBlue;
   Inc(PRGB);
  end;
 end;
end;
//模糊
procedure Blur(SrcBmp:TBitmap);
var
 i, j:Integer;
 SrcRGB:pRGBTriple;
 SrcNextRGB:pRGBTriple;
 SrcPreRGB:pRGBTriple;
 Value:Integer;
 procedure IncRGB;
 begin
  Inc(SrcPreRGB);
  Inc(SrcRGB);
  Inc(SrcNextRGB);
 end;
 procedure DecRGB;
 begin
  Inc(SrcPreRGB,-1);
  Inc(SrcRGB,-1);
  Inc(SrcNextRGB,-1);
 end;
begin
 SrcBmp.PixelFormat:=pf24Bit;
 for i := 0 to SrcBmp.Height - 1 do
 begin
  if i > 0 then
   SrcPreRGB:=SrcBmp.ScanLine[i-1]
  else
   SrcPreRGB := SrcBmp.ScanLine[i];
  SrcRGB := SrcBmp.ScanLine[i];
  if i < SrcBmp.Height - 1 then
   SrcNextRGB:=SrcBmp.ScanLine[i+1]
  else
   SrcNextRGB:=SrcBmp.ScanLine[i];
  for j := 0 to SrcBmp.Width - 1 do
  begin
   if j > 0 then DecRGB;
   Value:=SrcPreRGB.rgbtRed+SrcRGB.rgbtRed+SrcNextRGB.rgbtRed;
   if j > 0 then IncRGB;
   Value:=Value+SrcPreRGB.rgbtRed+SrcRGB.rgbtRed+SrcNextRGB.rgbtRed;
   if j < SrcBmp.Width - 1 then IncRGB;
   Value:=(Value+SrcPreRGB.rgbtRed+SrcRGB.rgbtRed+SrcNextRGB.rgbtRed) div 9;
   DecRGB;
   SrcRGB.rgbtRed:=value;
   if j > 0 then DecRGB;
   Value:=SrcPreRGB.rgbtGreen+SrcRGB.rgbtGreen+SrcNextRGB.rgbtGreen;
   if j > 0 then IncRGB;
   Value:=Value+SrcPreRGB.rgbtGreen+SrcRGB.rgbtGreen+SrcNextRGB.rgbtGreen;
   if j < SrcBmp.Width - 1 then IncRGB;
   Value:=(Value+SrcPreRGB.rgbtGreen+SrcRGB.rgbtGreen+SrcNextRGB.rgbtGreen) div 9;
   DecRGB;
   SrcRGB.rgbtGreen:=value;
   if j > 0 then DecRGB;
   Value:=SrcPreRGB.rgbtBlue+SrcRGB.rgbtBlue+SrcNextRGB.rgbtBlue;
   if j > 0 then IncRGB;
   Value:=Value+SrcPreRGB.rgbtBlue+SrcRGB.rgbtBlue+SrcNextRGB.rgbtBlue;
   if j < SrcBmp.Width - 1 then IncRGB;
   Value:=(Value+SrcPreRGB.rgbtBlue+SrcRGB.rgbtBlue+SrcNextRGB.rgbtBlue) div 9;
   DecRGB;
   SrcRGB.rgbtBlue:=value;
   IncRGB;
  end;
 end;
end;
//锐化
procedure Sharpen(SrcBmp:TBitmap);
var
 i, j: integer;
 SrcRGB: pRGBTriple;
 SrcPreRGB: pRGBTriple;
 Value: integer;
begin
 SrcBmp.PixelFormat:=pf24Bit;
 for i := 0 to SrcBmp.Height - 1 do
 begin
  SrcRGB := SrcBmp.ScanLine[i];
  if i > 0 then
   SrcPreRGB:=SrcBmp.ScanLine[i-1]
  else
   SrcPreRGB:=SrcBmp.ScanLine[i];
  for j := 0 to SrcBmp.Width - 1 do
  begin
   if j = 1 then Dec(SrcPreRGB);
   Value:=SrcRGB.rgbtRed+(SrcRGB.rgbtRed-SrcPreRGB.rgbtRed) div 2;
   Value:=Max(0,Value);
   Value:=Min(255,Value);
   SrcRGB.rgbtRed:=value;
   Value:=SrcRGB.rgbtGreen+(SrcRGB.rgbtGreen-SrcPreRGB.rgbtGreen) div 2;
   Value:=Max(0,Value);
   Value:=Min(255,Value);
   SrcRGB.rgbtGreen:=value;
   Value:=SrcRGB.rgbtBlue+(SrcRGB.rgbtBlue-SrcPreRGB.rgbtBlue) div 2;
   Value:=Max(0,Value);
   Value:=Min(255,Value);
   SrcRGB.rgbtBlue:=value;
   Inc(SrcRGB);
   Inc(SrcPreRGB);
  end;
 end;
end;
 [图像的旋转和翻转]
以下代码用ScanLine配合指针移动实现,用于24位色!
//旋转90度
procedure Rotate90(const Bitmap:TBitmap);
var
 i,j:Integer;
 rowIn,rowOut:pRGBTriple;
 Bmp:TBitmap;
 Width,Height:Integer;
begin
 Bmp:=TBitmap.Create;
 Bmp.Width := Bitmap.Height;
 Bmp.Height := Bitmap.Width;
 Bmp.PixelFormat := pf24bit;
 Width:=Bitmap.Width-1;
 Height:=Bitmap.Height-1;
 for j := 0 to Height do
 begin
  rowIn := Bitmap.ScanLine[j];
  for i := 0 to Width do
  begin
   rowOut := Bmp.ScanLine[i];
   Inc(rowOut,Height - j);
   rowOut^ := rowIn^;
   Inc(rowIn);
  end;
 end;
 Bitmap.Assign(Bmp);
end;
//旋转180度
procedure Rotate180(const Bitmap:TBitmap);
var
 i,j:Integer;
 rowIn,rowOut:pRGBTriple;
 Bmp:TBitmap;
 Width,Height:Integer;
begin
 Bmp:=TBitmap.Create;
 Bmp.Width := Bitmap.Width;
 Bmp.Height := Bitmap.Height;
 Bmp.PixelFormat := pf24bit;
 Width:=Bitmap.Width-1;
 Height:=Bitmap.Height-1;
 for j := 0 to Height do
 begin
  rowIn := Bitmap.ScanLine[j];
  for i := 0 to Width do
  begin
   rowOut := Bmp.ScanLine[Height - j];
   Inc(rowOut,Width - i);
   rowOut^ := rowIn^;
   Inc(rowIn);
  end;
 end;
 Bitmap.Assign(Bmp);
end;
//旋转270度
procedure Rotate270(const Bitmap:TBitmap);
var
 i,j:Integer;
 rowIn,rowOut:pRGBTriple;
 Bmp:TBitmap;
 Width,Height:Integer;
begin
 Bmp:=TBitmap.Create;
 Bmp.Width := Bitmap.Height;
 Bmp.Height := Bitmap.Width;
 Bmp.PixelFormat := pf24bit;
 Width:=Bitmap.Width-1;
 Height:=Bitmap.Height-1;
 for j := 0 to Height do
 begin
  rowIn := Bitmap.ScanLine[j];
  for i := 0 to Width do
  begin
   rowOut := Bmp.ScanLine[Width - i];
   Inc(rowOut,j);
   rowOut^ := rowIn^;
   Inc(rowIn);
  end;
 end;
 Bitmap.Assign(Bmp);
end;
//任意角度
function RotateBitmap(Bitmap:TBitmap;Angle:Integer;BackColor:TColor):TBitmap;
var
 i,j,iOriginal,jOriginal,CosPoint,SinPoint : integer;
 RowOriginal,RowRotated : pRGBTriple;
 SinTheta,CosTheta : Extended;
 AngleAdd : integer;
begin
 Result:=TBitmap.Create;
 Result.PixelFormat := pf24bit;
 Result.Canvas.Brush.Color:=BackColor;
 Angle:=Angle Mod 360;
 if Angle<0 then Angle:=360-Abs(Angle);
 if Angle=0 then
  Result.Assign(Bitmap)
 else if Angle=90 then
 begin
  Result.Assign(Bitmap);
  Rotate90(Result);//如果是旋转90度,直接调用上面的代码
 end
 else if (Angle>90) and (Angle<180) then
 begin
  AngleAdd:=90;
  Angle:=Angle-AngleAdd;
 end
 else if Angle=180 then
 begin
  Result.Assign(Bitmap);
  Rotate180(Result);//如果是旋转180度,直接调用上面的过程
 end
 else if (Angle>180) and (Angle<270) then
 begin
  AngleAdd:=180;
  Angle:=Angle-AngleAdd;
 end
 else if Angle=270 then
 begin
  Result.Assign(Bitmap);
  Rotate270(Result);//如果是旋转270度,直接调用上面的过程
 end
 else if (Angle>270) and (Angle<360) then
 begin
  AngleAdd:=270;
  Angle:=Angle-AngleAdd;
 end
 else
  AngleAdd:=0;
 if (Angle>0) and (Angle<90) then
 begin
 SinCos((Angle + AngleAdd) * Pi / 180, SinTheta, CosTheta);
 if (SinTheta * CosTheta) < 0 then
 begin
  Result.Width := Round(Abs(Bitmap.Width * CosTheta - Bitmap.Height * SinTheta));
  Result.Height := Round(Abs(Bitmap.Width * SinTheta - Bitmap.Height * CosTheta));
 end
 else
 begin
  Result.Width := Round(Abs(Bitmap.Width * CosTheta + Bitmap.Height * SinTheta));
  Result.Height := Round(Abs(Bitmap.Width * SinTheta + Bitmap.Height * CosTheta));
 end;
 CosTheta:=Abs(CosTheta);
 SinTheta:=Abs(SinTheta);
 if (AngleAdd=0) or (AngleAdd=180) then
 begin
  CosPoint:=Round(Bitmap.Height*CosTheta);
  SinPoint:=Round(Bitmap.Height*SinTheta);
 end
 else
 begin
  SinPoint:=Round(Bitmap.Width*CosTheta);
  CosPoint:=Round(Bitmap.Width*SinTheta);
 end;
 for j := 0 to Result.Height-1 do
 begin
  RowRotated := Result.Scanline[j];
  for i := 0 to Result.Width-1 do
  begin
   Case AngleAdd of
    0:
    begin
     jOriginal := Round((j+1)*CosTheta-(i+1-SinPoint)*SinTheta)-1;
     iOriginal := Round((i+1)*CosTheta-(CosPoint-j-1)*SinTheta)-1;
    end;
    90:
    begin
     iOriginal := Round((j+1)*SinTheta-(i+1-SinPoint) 

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Matlab解决线性规划问题 - The0Y发布时间:2022-07-18
下一篇:
Matlab的BP神经网络工具箱及其在函数逼近中的应用发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap