用DELPHI实现图像放大镜
Delphi图形图像处理

见例子
画矩形
StretchDraw StretchDraw(Const Rect : TRcct : Graphic : TGraphic); 此方法在Rect参数指定的矩形内画一图像。图像 延伸改变大小以适应矩形。 Rectangle Rectangle(X1,y1,x2,y2 : Integer); Rectangle方法在画布上用当前画刷绘制矩形, (x1,y1)是矩形的左上角,(x2,y2)是矩形的右下 角。
三.图像对象概述 3.1. TGraphic对象
TGraphic对象是 TBitmap ,TIcon,Tmetafile对象的基类。 如果知道图像的具体类型( 如位图, 图标 元文件) , 则应将图像贮存在相应类型的 对象中( 如TBitmap,TIcon,Tmetafile), 否则应该使用可贮存任何图像类型的 TPicture对象。
把点连成线
Polygon Polygon(Points : array of TPrint); Polygon方法在画布上绘制一系列的点,各点依 次连成线,最后将首尾两点相接形成一个区域, 并用当前笔刷填充此区域。 Polyline Polyline(Ports : array of TPort); Polyline方法在画布上用当前画笔绘制一系列的 点,各点依次连成线。
Tbrush对象方法
(1)Assign:向另一个对象赋值 (2)Create:创建一个TBrush对象实例。 (3)Destroy:释放一个TBrush对象实例。 (4)OwnHandle:用来确保对更基本的Qbrush 类实例的权限。当需要接受QBrush handle使用 或销毁权限时需要用到这个过程。 (5)ReleaseHandle:用来把TBrush 从 QBrush handle中分离出来,当需要把TBrush handle 给一段程序或一个类时,用到这个函数。
Delphi工具之Image Editor的使用

Delphi工具之Image Editor的使用Delphi Image Editor是一个工具,可用它来创建并编辑位图(.bmp)、图标(.ico)和光标(.cur),还可以用它创建资源工程,将多个位图、图标和光标包含到单个资源文件(.RES)中,再将该资源文件加到Delphi工程中供需要时使用。
如下图,是正在编辑中的Image Editor。
Note所有的Windows图像都是位图,无论它们是真正的Windows位图文件(.bmp),还是图标或光标。
在我们的讲解中,将所有图像都称为位图。
Image Editor只能处理Windows位图文件,它不支持其他文件格式,如PCX,TIFF,JPEG和GIF。
可从开始菜单中选择Image Editor菜单项启动Image Editor,也可以从Delphi的主菜单的【Tools | Image Editor】菜单项打开(如下图)。
Image Editor是一个单独的程序,不必在Delphi IDE中运行它。
Image Editor的各个部分介绍上图中将所有的工具箱中的工具名称列出,请熟悉它们。
Marquee选区工具和Lasso套索工具的作用一样的,前者用于选定矩形区域,后者用于任意形状的选择。
当一个区域被选定后,用户可剪切或复制该区域内的图像。
用Marquee和Lasso工具选定区域,将鼠标光标移动到该区域内(鼠标光标变成如下图的手型光标),拖动鼠标。
区域内的图像就会随鼠标的拖动而移动。
当剪切一个区域或移动它时,原始区域以当前背景色填充。
Note进行粘贴时,若选定了一个区域,则要粘贴的图像会随所选区域的大小而伸缩。
如下图:在使用Eraser橡皮工具时,鼠标的左右键的用法与使用其他工具时正好相反。
使用Eraser时,鼠标左键以背景色绘图,鼠标右键以前景色绘图。
Text工具能使用户在图像上书写文字,书写文字时使用当前正文设置,点击主菜单【Text】可设置字体的属性和正文对齐方式,如下图:Tip在画矩形时,可按住Shift键,将矩形变成正方形。
Delphi基本图像处理方法.

本文实例汇总了Delphi基本图像处理方法。
分享给大家供大家参考。
具体分析如下: //浮雕 procedureEmboss(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 thenSrcRGB1 := 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 div45+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 >= 45and (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; procedureEmboss(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 beginPRGB^.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; beginBmp.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 thenPRGB^.rgbtGreen :=not PRGB^.rgbtGreen; if PRGB^.rgbtBlue<128 thenPRGB^.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] elseSrcNextRGB:=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 thenIncRGB;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; //锐化 procedureSharpen(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 beginrowOut := Bmp.ScanLine[i]; Inc(rowOut,Height - j; rowOut^ := rowIn^; Inc(rowIn; end;end; Bitmap.Assign(Bmp; end; //旋转180度 procedure Rotate180(constBitmap: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; //任意角度 functionRotateBitmap(Bitmap:TBitmap;Angle:Integer;BackColor:TColor:TBitmap; vari,j,iOriginal,jOriginal,CosPoint,SinPoint : integer; RowOriginal,RowRotated : pRGBTriple; SinTheta,CosTheta : Extended; AngleAdd : integer; beginResult:=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 beginSinPoint:=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*CosTheta-1; jOriginal := Bitmap.Height-Round((i+1*SinTheta-(CosPoint-j-1*CosTheta; end; 180: begin jOriginal := Bitmap.Height-Round((j+1*CosTheta-(i+1-SinPoint*SinTheta; iOriginal := Bitmap.Width-Round((i+1*CosTheta-(CosPoint-j-1*SinTheta; end; 270: begin iOriginal := Bitmap.Width-Round((j+1*SinTheta-(i+1-SinPoint*CosTheta; jOriginal := Round((i+1*SinTheta-(CosPoint-j-1*CosTheta-1; end; end; if (iOriginal >= 0 and (iOriginal <= Bitmap.Width-1and (jOriginal >= 0 and (jOriginal <=Bitmap.Height-1 then begin RowOriginal := Bitmap.Scanline[jOriginal];Inc(RowOriginal,iOriginal; RowRotated^ := RowOriginal^; Inc(RowRotated; end else begin Inc(RowRotated; end; end; end; end; end; //水平翻转 procedure FlipHorz(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[j]; Inc(rowOut,Width - i; rowOut^ := rowIn^; Inc(rowIn; end; end; Bitmap.Assign(Bmp; end; //垂直翻转 procedureFlipVert(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 beginrowIn := Bitmap.ScanLine[j]; for i := 0 to Width do begin rowOut :=Bmp.ScanLine[Height - j]; Inc(rowOut,i; rowOut^ := rowIn^; Inc(rowIn; end; end; Bitmap.Assign(Bmp; end; [亮度、对比度、饱和度的调整] 以下代码用ScanLine配合指针移动实现! function Min(a, b: integer: integer; begin if a < b then result := a else result := b; end; function Max(a, b: integer: integer; begin if a > b then result := a else result := b; end; //亮度调整 procedure BrightnessChange(constSrcBmp,DestBmp:TBitmap;ValueChange:integer; var i, j: integer; SrcRGB, DestRGB: pRGBTriple; begin for i := 0 to SrcBmp.Height - 1 do begin SrcRGB :=SrcBmp.ScanLine[i]; DestRGB := DestBmp.ScanLine[i]; for j := 0 to SrcBmp.Width - 1 do begin if ValueChange > 0 then begin DestRGB.rgbtRed := Min(255, SrcRGB.rgbtRed + ValueChange; DestRGB.rgbtGreen := Min(255, SrcRGB.rgbtGreen + ValueChange; DestRGB.rgbtBlue := Min(255, SrcRGB.rgbtBlue + ValueChange; end else begin DestRGB.rgbtRed := Max(0, SrcRGB.rgbtRed + ValueChange; DestRGB.rgbtGreen := Max(0, SrcRGB.rgbtGreen + ValueChange; DestRGB.rgbtBlue := Max(0,SrcRGB.rgbtBlue + ValueChange; end; Inc(SrcRGB; Inc(DestRGB; end; end; end; //对比度调整 procedure ContrastChange(const SrcBmp,DestBmp:TBitmap;ValueChange:integer; var i, j: integer; SrcRGB, DestRGB: pRGBTriple; begin for i := 0 to SrcBmp.Height - 1 do begin SrcRGB := SrcBmp.ScanLine[i]; DestRGB := DestBmp.ScanLine[i]; for j := 0 to SrcBmp.Width - 1 do begin if ValueChange>=0 then begin if SrcRGB.rgbtRed >= 128 then DestRGB.rgbtRed := Min(255, SrcRGB.rgbtRed + ValueChange else DestRGB.rgbtRed := Max(0, SrcRGB.rgbtRed - ValueChange; if SrcRGB.rgbtGreen >= 128 then DestRGB.rgbtGreen := Min(255, SrcRGB.rgbtGreen + ValueChange else DestRGB.rgbtGreen := Max(0, SrcRGB.rgbtGreen - ValueChange; ifSrcRGB.rgbtBlue >= 128 then DestRGB.rgbtBlue := Min(255, SrcRGB.rgbtBlue + ValueChange else DestRGB.rgbtBlue := Max(0, SrcRGB.rgbtBlue - ValueChange; end else begin if SrcRGB.rgbtRed >= 128 then DestRGB.rgbtRed := Max(128,SrcRGB.rgbtRed + ValueChange else DestRGB.rgbtRed := Min(128, SrcRGB.rgbtRed - ValueChange; if SrcRGB.rgbtGreen >= 128 then DestRGB.rgbtGreen := Max(128, SrcRGB.rgbtGreen + ValueChange else DestRGB.rgbtGreen := Min(128,SrcRGB.rgbtGreen - ValueChange; if SrcRGB.rgbtBlue >= 128 thenDestRGB.rgbtBlue := Max(128, SrcRGB.rgbtBlue + ValueChange elseDestRGB.rgbtBlue := Min(128, SrcRGB.rgbtBlue - ValueChange; end; Inc(SrcRGB; Inc(DestRGB; end; end; end; //饱和度调整 procedure SaturationChange(const SrcBmp,DestBmp:TBitmap;ValueChange:integer; var Grays: array[0..767] of Integer; Alpha: array[0..255] of Word; Gray, x, y: Integer; SrcRGB,DestRGB: pRGBTriple; i: Byte; begin ValueChange:=ValueChange+255; for i := 0 to 255 do Alpha[i] := (i * ValueChange Shr 8; x := 0; for i := 0 to 255 do begin Gray := i - Alpha[i]; Grays[x] := Gray; Inc(x; Grays[x] := Gray; Inc(x; Grays[x] := Gray; Inc(x; end; for y := 0 to SrcBmp.Height - 1 do begin SrcRGB := SrcBmp.ScanLine[Y]; DestRGB := DestBmp.ScanLine[Y]; for x := 0 to SrcBmp.Width - 1 do begin Gray :=Grays[SrcRGB.rgbtRed + SrcRGB.rgbtGreen + SrcRGB.rgbtBlue]; if Gray +Alpha[SrcRGB.rgbtRed]>0 then DestRGB.rgbtRed := Min(255,Gray +Alpha[SrcRGB.rgbtRed] else DestRGB.rgbtRed := 0; if Gray +Alpha[SrcRGB.rgbtGreen]>0 then DestRGB.rgbtGreen := Min(255,Gray +Alpha[SrcRGB.rgbtGreen] else DestRGB.rgbtGreen := 0; if Gray +Alpha[SrcRGB.rgbtBlue]>0 then DestRGB.rgbtBlue := Min(255,Gray +Alpha[SrcRGB.rgbtBlue] else DestRGB.rgbtBlue := 0; Inc(SrcRGB; Inc(DestRGB; end; end; end; //RGB调整 procedureRGBChange(SrcBmp,DestBmp:TBitmap;RedChange,GreenChange,BlueChange:integer; var SrcRGB, DestRGB: pRGBTriple; i,j:integer; begin for i := 0 to SrcBmp.Height- 1 dobegin SrcRGB := SrcBmp.ScanLine[i]; DestRGB :=DestBmp.ScanLine[i]; for j := 0 to SrcBmp.Width - 1 do begin if RedChange> 0 then DestRGB.rgbtRed:= Min(255, SrcRGB.rgbtRed + RedChange else DestRGB.rgbtRed := Max(0, SrcRGB.rgbtRed + RedChange; if GreenChange> 0 then DestRGB.rgbtGreen :=Min(255, SrcRGB.rgbtGreen + GreenChange else DestRGB.rgbtGreen := Max(0, SrcRGB.rgbtGreen + GreenChange; if BlueChange> 0 then DestRGB.rgbtBlue :=Min(255, SrcRGB.rgbtBlue + BlueChange else DestRGB.rgbtBlue := Max(0, SrcRGB.rgbtBlue + BlueChange; Inc(SrcRGB; Inc(DestRGB; end; end; end; [颜色调整] //RGB<=>BGR procedure RGB2BGR(const Bitmap:TBitmap; var X: Integer; Y: Integer; PRGB: pRGBTriple; Color: Byte; begin for Y := 0 to (Bitmap.Height - 1 do begin forX := 0 to (Bitmap.Width - 1 do begin Color := PRGB^.rgbtRed; PRGB^.rgbtRed := PRGB^.rgbtBlue; PRGB^.rgbtBlue := Color; Inc(PRGB; end; end end; end; //灰度化(加权 procedure Grayscale(const Bitmap:TBitmap; var X: Integer; Y: Integer; PRGB: pRGBTriple; Gray: Byte; begin for Y := 0 to (Bitmap.Height - 1 do begin PRGB := Bitmap.ScanLine[Y]; for X := 0 to (Bitmap.Width - 1 do begin Gray := (77 * Red + 151 * Green + 28 * Blue shr 8; PRGB^.rgbtRed:=Gray; PRGB^.rgbtGreen:=Gray;PRGB^.rgbtBlue:=Gray; Inc(PRGB; end; end; end; 绘图区-即窗口显示图像的区域,亦可为全屏幕(在全屏幕下绘图的效果比一般窗口下好)中心点-即要绘图区显示的中心点在原始图像的坐标(声明:这个概念特别重要)先说说图像的放大,要放大一张图片,我们一般的做法是直接放大图像,但本文介绍的方法仅放大我们能够看到的部分,放大分两种情况,一种是放大后比绘图区还要小,这种情况没什么好说,当然是显示全部的图像;第二种是放大后的图像比绘图区大,这才是我们今天要讨论的重点话题,这种情况下我们先要确定图像放大后的大小,然后根据“中心点”计算在原始图像的位置和大小,最后把截取的图像放大到绘图区。
delphi放大镜源文件

unit ScreenMagnifier;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Spin, ComCtrls, ExtDlgs;typeTMagnifierForm = class(TForm)BigImage: TImage;OpenPictureDialog: TOpenPictureDialog;GroupBoxMagnifier: TGroupBox;LabelMagnifiation: TLabel;SpinEditMagnification: TSpinEdit;LabelX: TLabel;LabelRadius: TLabel;SpinEditMagnifierRadius: TSpinEdit;RadioGroupMagnifierShape: TRadioGroup;CheckBoxMagnifierCursor: TCheckBox;GroupBoxImage: TGroupBox;LoadButton: TButton;CheckBoxStretch: TCheckBox;LabelFilename: TLabel;LabelBitmapAttributes: TLabel;LabelLocation: TLabel;CheckBoxMagnifierBorder: TCheckBox;ColorDialog: TColorDialog;ShapeBorderColor: TShape;procedure BigImageMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);procedure FormCreate(Sender: TObject);procedure FormDestroy(Sender: TObject);procedure FormPaint(Sender: TObject);procedure LoadButtonClick(Sender: TObject);procedure CheckBoxStretchClick(Sender: TObject);procedure BigImageMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);procedure BigImageMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);procedure ShapeBorderColorMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);privateBitmap: TBitmap;ImageDesignHeight: INTEGER;ImageDesignWidth: INTEGER;MagnifierShowing: BOOLEAN;procedure AdjustIma geSize;procedure ShowMagnifier(const X, Y: INTEGER);public{ Public declarations }end;varMagnifierForm: TMagnifierForm;implementation{$R *.DFM}usesIniFiles;constKeywordSetup = '信息文件当前路径';KeywordDirectory = '目录';function IsPaletteDevice: BOOLEAN;varDeviceContext: hDC;begin//获取屏幕DCDeviceContext := GetDC(0);tryRESULT := GetDeviceCaps(DeviceContext, RASTERCAPS) andRC_PALETTE = RC_PALETTEfinally// Give back the screen DCReleaseDC(0, DeviceContext)endend {是否设备调色板};function GetPixelFormatString(const PixelFormat: TPixelFormat): string;varFormat: string;begincase PixelFormat ofpfDevice: Format := 'Device';pf1bit: Format := '1 bit';pf4bit: Format := '4 bit';pf8bit: Format := '8 bit';pf15bit: Format := '15 bit';pf16bit: Format := '16 bit';pf24bit: Format := '24 bit';pf32bit: Format := '32 bit'elseFormat := 'Unknown';end;RESULT := Format;end {获得象素格式字符串};function GetBitmapDimensionsString(const Bitmap: TBitmap): string;beginRESULT := IntToStr(Bitmap.Width) + ' by ' +IntToStr(Bitmap.Height) + ' pixels by ' +GetPixelFormatString(Bitmap.PixelFormat) + ' color';end {获取位图的尺寸};//===========================================================================procedure TMagnifierForm.ShowMagnifier(const X, Y: INTEGER);const// 用额外的空间绘制环面ExtraSpace = 8; // pixelsHalfExtraSpace = ExtraSpace div 2;QuarterExtraSpace = ExtraSpace div 4;varAreaRadius: INTEGER;CircularMask: TBitmap;Magnification: INTEGER;ModifiedBitmap: TBitmap;xActual: INTEGER;yActual: INTEGER;beginif CheckboxStretch.Checked//拉伸则算出真实坐标then beginxActual := MulDiv(X, Bitmap.Width, BigImage.Width);yActual := MulDiv(Y, Bitmap.Height, BigImage.Height) endelse beginxActual := X;yActual := Yend;Magnification := SpinEditMagnification.Value;//放大率AreaRadius := ROUND(SpinEditMagnifierRadius.Value / Magnification);//放大半径if AreaRadius < 2then begin// 防止小位图出现问题AreaRadius := 2;SpinEditMagnifierRadius.Value := AreaRadius * Magnificationend;// 创建原始位图ModifiedBitmap := TBitmap.Create;trywith ModifiedBitmap dobeginAssign(Bitmap); // 由基本图加载case RadioGroupMagnifierShape.ItemIndex of// 方形放大:0: beginif CheckBoxMagnifierBorder.Checkedthen begin// 单象素边界Canvas.Brush.Color := clBlack;Canvas.Pen.Color := ColorDialog.Color;//边框颜色Canvas.Pen.Style := psSolid;// 绘制边框Canvas.Rectangle(xActual - AreaRadius * Magnification - 1,yActual - AreaRadius * Magnification - 1,xActual + AreaRadius * Magnification + 1,yActual + AreaRadius * Magnification + 1);end;Canvas.CopyMode := cmSrcCopy;//设置拷贝模式Canvas.CopyRect(Rect(xActual - AreaRadius * Magnification,yActual - AreaRadius * Magnification,xActual + AreaRadius * Magnification,yActual + AreaRadius * Magnification),Bitmap.Canvas,Rect(xActual - AreaRadius,yActual - AreaRadius,xActual + AreaRadius,yActual + AreaRadius));//从基本位图拷贝到ModifiedBitmapend;// 如果是圆形1: beginCircularMask := TBitmap.Create;//创建位图tryCircularMask.Width := 2 * AreaRadius * Magnification + ExtraSpace;CircularMask.Height := 2 * AreaRadius * Magnification + ExtraSpace;//设置尺寸with CircularMask.Canvas dobeginBrush.Color := clBlack;Brush.Style := bsSolid;FillRect(ClipRect);//正方形用黑色填充Brush.Color := clWhite;Ellipse(HalfExtraSpace,HalfExtraSpace,CircularMask.Width - HalfExtraSpace,CircularMask.Height - HalfExtraSpace);//绘制圆形,并且是白色区域// 使用掩模方式.即源位图与目标画布进行与操作CopyMode := cmSrcAnd;CopyRect(Rect(0, 0,CircularMask.Width,CircularMask.Height),Bitmap.Canvas,Rect(xActual - AreaRadius,yActual - AreaRadius,xActual + AreaRadius,yActual + AreaRadius))end;//将Bitmap的相应位置拷贝到CircularMask位图上CircularMask.Transparent := TRUE;Canvas.Draw(xActual - AreaRadius * Magnification - HalfExtraSpace,yActual - AreaRadius * Magnification - HalfExtraSpace,CircularMask);if CheckBoxMagnifierBorder.Checked//如果需要边界显示then beginwith CircularMask.Canvas dobeginBrush.Color := clBlack;Brush.Style := bsSolid;FillRect(ClipRect);Brush.Color := ColorDialog.Color;Ellipse(QuarterExtraSpace,QuarterExtraSpace,CircularMask.Width - QuarterExtraSpace,CircularMask.Height - QuarterExtraSpace);Brush.Color := clBlack;Ellipse(HalfExtraSpace,HalfExtraSpace,CircularMask.Width - HalfExtraSpace,CircularMask.Height - HalfExtraSpace)end;CircularMask.Transparent := TRUE;Canvas.Draw(xActual - AreaRadius * Magnification - HalfExtraSpace,yActual - AreaRadius * Magnification - HalfExtraSpace,CircularMask);endfinallyCircularMask.Freeendend;elseend;end;// 显示修改过的位图BigImage.Picture.Graphic := ModifiedBitmapfinallyModifiedBitmap.Freeendend;procedure TMagnifierForm.BigImageMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);varTargetColor: TColor;xActual: INTEGER;yActual: INTEGER;beginif CheckboxStretch.Checked//如果拉伸。
在Delphi中实现图片的旋转、缩放

在Delphi中实现图片的旋转、缩放好长时间没有写东西了并不是因为前面的东西遭受了很多西红柿和鸡蛋而是自己实在没有什么真实的东西写出来供大家参考但是最近在帮一个朋友做一个项目的时候遇到了在delphi中对图像的简单处理于是不停的从网上找资料翻看csdn以前的帖子从我搜索的结果发现很多人会在各种项目中遇到类似的图片处理问题但是多数得到的答案似乎并不完整(因为很多都没有结帖也可能是个人习惯的问题呵呵希望大家读了我这个文章之后能够家开结帖速度)于是我把我遇到的问题和解决方案写在下面供大家参考同时欢迎大家继续拍砖在正式内容之前要把我要解决的问题写在前面同时也让读者有一个好的定位从而不会因为我在处理过程中的拙劣手段而感到恼火这里主要解决的问题是在Delphi中将用扫描仪扫描得到的图片进行度旋转从而得到适合使用的图片并且由于不能正确把握图片的大小因此要对图片进行简单的缩放而我的解决方法也完全是根据此要求进行因为对于效率图片处理之后的清晰度考虑的不是很多同时带来的好处就是程序看起来很简单首先我没有扫描仪因此我不知道使用扫描程序(已经提供)得到的图片是什么格式而在Delphi的帮助中说 A bitmap is a powerful graphics object used to create manipulate (scale scroll rotate and paint) and store images in memory and as files on a disk 所以我的第一步就是要把我的片转化为TBitmap来处理在转化格式的同时我将图片的实际大小改变以适合后面选取部分图像的需要函数如下procedure TMainForm ChangeImageFormate;var Bitmap : TBitmap;Zoom : Integer;beginBitmap := TBitmap Create; // trywith ImageCert do beginBitmap Assign(Picture Graphic); // Picture := nil; // Zoom := Max(Bitmap Width div Width Bitmap Height div Height)+ ; // Width := Bitmap Width div Zoom; // Height := Bitmap Height div Zoom; // Canvas StretchDraw(Rect( Width Height) Bitmap); // end;finallyBitmapFree;end; end;我想这段代码并不是很复杂ImageCert是一个TImage控件放在Form上唯一可能陌生的就是第八句但是大家可以从Delphi的帮助中得到很到说明我在这就不再翻译了(我的建议就是多看帮助)同时应该指出的是第三句作用是很关键的如果去掉这一句同时你的图片格式不是bmp的话就会出现只有bitmap才能才能修改的错误第二步就是实现图片的旋转因为程序要求只是每次旋转度即可因此这里也比较容易处理处理的手段就是按照像素进行替换实现过程如下procedure TMainForm RotateImage;var x y : Integer;TmpBitMap : TBitmap;beginTmpBitMap := TBitmap Create;tryTmpBitMap Assign(ImageCert Picture Graphic);with ImageCert do beginPicture Bitmap Height := TmpBitMap Width;Picture Bitmap Width := TmpBitMap Height;for x:= to Height dofor y:= to Width doCanvas Pixels[TmpBitMap Height x y] := TmpBitMap Canvas Pixels[y x];Height := TmpBitMap Width;Width := TmpBitMap Height;end;finallyTmpBitMap Free;end;end;这段程序也没有什么好讲的但是几个高度和宽度的设置令我是分的烦闷总是觉得多做的点什么但是却偏偏去不掉任何一行如果哪位有兴趣可以尝试一下最好把结果也告诉我一声而且在这个里面由于TImage和TBitmap都有各自的canvas 所以使用哪一个可能也是值得研究的但是由于时间有限就没有在尝试了至于在部分取图的过程中我是用了一个TShape 然后用将brush 的style设置成bsclear 在ImageCert的onMouseMove中安排这个TShap的位置这样做不是很灵敏因为当鼠标在TShape上面时则不会起到作用所幸影响不大同时我在TShape的OnMouseDown事件中取出TShape下面的部分图片这个时候如果你的图片没有做过缩放处理就会发现取出的图片和我们看到的位置不相符(当然是在TImage 没有正确显示图片大小的情况下)可以肯定这个方法不是很好的方法但是至少它解决了问题lishixinzhi/Article/program/Delphi/201311/24976。
DELPHI基础教程:Delphi图形图像编程(二)[2]
![DELPHI基础教程:Delphi图形图像编程(二)[2]](https://img.taocdn.com/s3/m/05d9583158eef8c75fbfc77da26925c52cc591b9.png)
DELPHI基础教程:Delphi图形图像编程(二)[2]另外一个问题是我们希望得到的是鼠标按钮按下和松开这两点所形成的图形但OnMouseMove却把鼠标轨迹上各点与起始点所形成的所有图形画在屏幕上这同样是我们不希望看到的为了解决这些问题程序定义了鼠标的三个事件procedure TForm FormMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X Y: Integer)beginDrawing := True;Image Canvas MoveTo(X Y)Origin := Point(X Y)MovePt := Origin;OriginPanel Caption := Format( Origin: (%d %d) [X Y])end;procedure TForm FormMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X Y: Integer)beginif Drawing thenDrawShape(Origin Point(X Y) pmCopy)Drawing := False;end;procedure TForm FormMouseMove(Sender: TObject; Shift: TShiftState; XY: Integer)beginif Drawing thenbeginDrawShape(Origin MovePt pmNotXor)MovePt := Point(X Y)DrawShape(Origin MovePt pmNotXor)end;MovePt用来记录鼠标当前位置当下次鼠标移动时就能在上次鼠标绘制的图形上画一个形状大小一样的图形并把画笔颜色设置成PmNotXor 使上次绘制的图形颜色变成了屏幕颜色从而达到橡皮擦的效果将画笔画刷的Style属性设置成用户希望的值可实现对画笔和画刷风格的选择procedure TForm SetBrushStyle(Sender: TObject)beginwith Image Canvas Brush dobeginif Sender = SolidBrush then Style := bsSolidelse if Sender = ClearBrush then Style := bsClearelse if Sender = HorizontalBrush then Style := bsHorizontal else if Sender = VerticalBrush then Style := bsVerticalelse if Sender = FDiagonalBrush then Style := bsFDiagonal else if Sender = BDiagonalBrush then Style := bsBDiagonal else if Sender = CrossBrush then Style := bsCrosselse if Sender = DiagCrossBrush then Style := bsDiagCross;end;procedure TForm SetPenStyle(Sender: TObject)beginwith Image Canvas Pen dobeginif Sender = SolidPen then Style := psSolidelse if Sender = DashPen then Style := psDashelse if Sender = DotPen then Style := psDotelse if Sender = DashDotPen then Style := psDashDotelse if Sender = DashDotDotPen then Style := psDashDotDot else if Sender = ClearPen then Style := psClear;end;end;图像对象概述TGraphic对象TGraphic对象是TBitmap TIcon Tmetafile对象的基类如果知道图像的具体类型(如位图图标元文件)则应将图像贮存在相应类型的对象中(如TBitmap TIcon Tmetafile)否则应该使用可贮存任何图像类型的TPicture对象TPicture对象TPicture对象可以保存位图图标或元文件 Graphic属性中包括图像的类型图像的高度和宽度分别定义在Height Width属性中调用LoadFromFile方法可以从文件中装载一幅图像procedure TForm FormCreate(Sender: TObject)beginBitBtn Glyph LoadFromFile( TARTAN BMP )end;要保存一个位图则要用SaveToFile方法要把图像复制到剪切板可以调用TClipboard对象的Assign方法TImage部件TImage部件用以在窗体中显示图像它的Picture 属性保存着要显示的图像这是一个TPicture对象AutoSize Stretch属性是用来调节部件与图像的大小的当AutoSize 为真值时TImage部件将根据它所包含的图像的大小来调整自身的大小当AutoSize为假值时不论图像有多大部件将保持设计时的大小如果部件比图像小那么只有一部分图像是可见的当Stretch为真值时位图像将根据部件的大小调整自身的大小当部件大小改变时元文件也做相应变化 Stretch属性对图标没有作用TBitmap Object(位图对象)位图对象包含一个位图图像有HBITMAP HPALETE句柄可自动管理调色板位图对象也有画布属性位图的Palette属性用来控制位图的颜色映射它包括种可显示的颜色如果应用程序用前景色绘制位图Palette 属性的颜色将被加入Windows系统调色板其它颜色被映射到系统调色板已存在的颜色如果应用程序用自己的颜色绘制位图而其它程序已占有系统调色板位图的颜色将被映射到系统调色板中如果Monochrome属性设置成假位图将显示成彩色反之显示成黑白色调用Draw和StretchDraw方法可在画布上绘制位图图像对象的应用本章例程中单击(文件|浏览)菜单项将弹出一个图像浏览窗体如果用户在窗体中选择文件列表框的图形文件窗体右上角的图像部件上将出现此文件所代表的图像若选择雕刻效果按钮中检查框窗体中的加速按钮和位图按钮上将出现位图以下代码是将图像文件装载至图像部件上procedure TImageForm FileListBox Click(Sender: TObject)varFileExt: string[ ];beginFileExt := UpperCase(ExtractFileExt(FileListBox Filename))if (FileExt = BMP ) or (FileExt = ICO ) or (FileExt = WMF )thenbeginImage Picture LoadFromFile(FileListBox Filename)Label Caption := ExtractFilename(FileListBox Filename)if (FileExt = BMP ) thenbeginLabel Caption := Label Caption +Format((%d x %d) [Image Picture Height Image PictureWidth])ViewForm Image Picture Bitmap := Image Picture Bitmap;ViewAsGlyph(FileExt)end;if FileExt = ICO then Icon := Image Picture Icon;if FileExt = WMF thenViewForm Image Picture Metafile := Image Picture Metafile;end;end;这个过程首先判断文件类型如果是图像文件则将图像装载至图像部件上并在标签上列出文件名称如果是位图文件还将显示其大小lishixinzhi/Article/program/Delphi/201311/25244。
DELPHI实现图像的镜像

----一、镜像显示的原理
----所谓的镜像显示,就是好象一幅图像放在镜子头面,形成两幅绝对对称的图像,具体操作时具有水平镜向和垂直镜像之分,这其中包括两幅图像的显示过程,即正面图像和反面图像,正面图像的显示方法非常简单,在DELPHI中有多种方法,关键之处是反面图像的显示过程,这其中涉及图像的变形操作;实现图像变形的一种简单方法是重新安排象素位置,比如左面和右面的象素条一一对换,即可得到水平方向的反面
top:=0;
right:=I+1;
bottom:=bitmap.height;
end;
with rect2 do
begin
left:=(form1.width div 2)-I-1;
top:=I;
right:=(form1.width div 2)-I;
bottom:=bitmap.height+I;
end;
with rect3 do
begin
left:=(form1.width div 2)+I-1;
top:=I;
right:=(form1.width div 2)+I;
bottom:=bitmap.height+I;
end;
canvas.copyrect(rect2,bitmap.canvas,rect1);
if OpenDialog1.Execute then
bitmap.loadfromfile(OpenDialog1.filename);
Form1.Canvas.Draw(0,0, Bitmap);
end;
//按Байду номын сангаас1垂直镜像
Delphi中图像的像素级操作

Delphi中图像的像素级操作Delphi中图像的像素级操作华软源码一般的可视性编程语言,如VB本身只具有图像的一般显示功能, 加上简单的图像伸缩处理, 在进行一些图像复杂的特技显示时必须借助于Windows的有关API 函数。
但Delphi为用户提供了更为完善的图像处理能力, 依靠它本身的功能完全可以实现图像的像素级操作?疚慕樯芰薉elphi中像素级图像操作的基本原理、应用和实例。
一、基本原理在Delphi中有很多控件具有CANVAS属性, 即所谓的画布, 利用这一属性可以在控件的表面进行图形图像处理工作, 其中有一个CopyRect命令, 具体参数格式:Copyrect(Dest:TRect;Canvas:Tcanvas;Source:TRect);其中:Dest:目标画布矩形 Canvas:源画布 Source:源矩形,其功能是把图像从一个源矩形RECT内,复制到目标矩形RECT内, 复制的图像具有自动伸缩性质。
从这个命令的表面看只能进行图像的全部或部分复制功能,其实如果把矩形RECT定义成只有一个像素大小, 即可以从源图像中取出一个像素点, 即进行图像的像素级操作, 比如:Rect(0,0,1,1)可指定某图像源的左上角第一个像素。
二、像素级操作的应用图像的像素级操作可广泛应用在图像的特技显示效果制作工作中, 并且可以实现较为复杂的图像处理工作, 举例如下:1.图像的旋转: 在Delphi中利用其他方法显示图像时,比如利用图像框IMAGE 或者DRAW命令, 只能按原图的方向显示, 进行图像的旋转显示必须以像素为单位进行处理,重新安排像素的排列位置, 比如按先横向后纵向的方式读取原图像,然后按先纵向后横向的方式写像素,最终将形成旋转90度的图像,按同样的原理可形成旋转180度或270度的图像。
2.图像尺寸的改变: 图像尺寸的改变在Windows 中好象并不需要像素级操作, 利用图像框的伸缩性可以简单地完成这一工作, 但利用像素操作改变图像尺寸是图像放大或缩小操作的根本, 并且可以具有更高的精确和更高的灵活性?热绾嶙菹蚓扛粢坏闳∫幌袼? 连续写在目标画布上, 即可使图像缩小到原来的四分之一;而读出一点像素后, 在目标画布上连续写两点以上, 即可实现图像的放大显示。
Delphi中使用DirectDraw技术进行图形处理

Delphi中使用DirectDraw技术进行图形处理DirectDraw是一套名为DirectX复杂工具的一部分,DirectX是由许多不同的技术组成,比如:DirectDraw、Direct3D、DirectSound、DirectPlay、DirectInput和DirectSetup等。
其中的每一种技术都是集中了几种处多媒体的技术或游戏的技术,像声音播放、3D图形、网络播放、硬件设备如鼠标和强制反馈等等。
不过,在本章中将只介绍DirectDraw,并且这个主题很容易就会占用一章或更多的章节关于DirectX的其他技术内容,读者可以去参阅其他关于DirectX的书籍。
DirectDraw程序要求用户的系统必须有DirectDraw运行时的DLL,这些运行时文件(实际只是DLL的集合,可能许多机器已经安装了),还可以从Micorsoft的Web站点获取;该站点有各种各样的产品,包括游戏、Windows 98、将来的操作系统Windows NT 5等。
如果读者正在使用的是Windows NT 4,那么至少要用Service Pack 3(SP3)去升级,之后才能够访问作为SP3一部分的DirectDraw 3。
不要试图直接在Windows NT系统下安装运行时的DirectDraw,而应该安装最新的补丁(Service Pack),直接安装运行时的DirectDraw是针对Windows 95/98系统而言的。
确定一个系统是否安装了DirectDraw的一个方法是查看Windows/System或Winnt/System32目录是否存在DDRAW.DLL和DSOUND.DLL,如果有,则说明系统已经安装了DirectDraw。
在可能的情况下,读者应该从Microsoft获取DirectDraw SDK,通常它可以从Microsoft 的Web站点下载得到,不过请注意,它至少有30M。
安装了SDK后,它在硬盘上创建一个名为DXSDK的目录,在这个目录之下是SDK目录,其中包含有各种各样的文档、用C/C++编写的示例文件和帮助文件。
delphiimage控件如何根据图片的大小自动缩放并显示

delphiimage控件如何根据图⽚的⼤⼩⾃动缩放并显⽰在 delphi 语⾔中,让 image 控件根据图⽚bai的⼤⼩⾃动缩放并显⽰du的步骤如下:
1、从zhi Tool Palette ⾯板上找到 TImage 控件,并拖放到窗dao⼝:
2、选中 Image 控件,调整到合适⼤⼩,并设置其属性:
Anchors 属性:
设置让 image 控件的⼤⼩随窗体改变⽽变化,并保持与左、右、上、下的边距不变。
Stretch 设置为 True:
此项属性是关键设置,当此项设置为 True 时,Image 的图像就可以⾃动随⼤⼩的改变⽽拉伸或压缩显⽰:
帮助⼿册中关于 Image 控件的 Stretch 属性描述如下:
3、完成上述设置之后,就可以编写相关代码了。
以下是编写的⼀个⽰例代码,使⽤了 TImage、TOpenPictureDialog、TButton 控件,供参考:
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenPictureDialog1.Execute then
begin
Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
end;
end;
代码运⾏截图:
点击打开图⽚按钮载⼊图⽚:
拉宽窗体,图⽚随之变宽:。
delphi实现bmp与jpg图像相互转换及位图大小调整

delphi实现bmp与jpg图像相互转换及位图大小调整delphi实现bmp与jpg图像相互转换及位图大小调整摘要:本文介绍了如何通过delphi编码实现bmp格式图像与jpeg格式图像的相互转换以及bmp格式图像的大小的调整。
在图片处理操作中使用了几个api函数,其算法同样适用于其他编程语言。
关键词:图形转换、图片调整在很多MIS系统或者其他管理信息系统中,有需要用户上传照片到数据库等对图片的操作,根据系统需求不同,可能需要对这些照片进行格式转换或者大小的调整。
这里有三个在MIS系统或者其他管理信息系统中比较常用的图片处理过程,与大家分享。
1、Bmp格式转换位jpg(jpeg)格式。
进程:Image_BitmapToJPeg实现bmp格式图片到Jpg(jpeg)格式图片的转换,如下:{参数介绍:FileName:要转换的位图的路径及名称SaveFileName:转换后生成jpg图形的路径及名称}Procedure Image_BitmapToJPeg(Const FileName: String;SaveFileName:String='');V arBitmap: TBitmap; //定义变量JPeg: TJPegImage; //所属unit是:Jpeg,需要在项目的uses 中加入Jpeg BeginTryBitmap := TBitmap.Create; //创建位图资源Bitmap.LoadFromFile(FileName); //根据传入的参数载入位图资源JPeg := TJPegImage.Create; //创建jpeg资源JPeg.Assign(Bitmap); //把bitmap中的图像资源拷贝到jpeg对象中IF Trim(SaveFileName)='' Then //如果传入的目的地址为空,按原名保存(扩展名改变)JPeg.SaveToFile(ChangeFileExt(FileName, '.jpg'))Else //按参数指定的名称保存jpg图片JPeg.SaveToFile(SaveFileName);FinallyFreeAndNil(Bitmap); //释放资源FreeAndNil(JPeg); //释放资源End;End;从上面的代码及其注释中我们可以看出程序思路,首先分别定义并创建bmp 对象Bitmap和jpeg对象JPeg,然后在Bitmap对象载入位图后,把Bitmap中的图像资源复制到Jpeg中,最后把Jpeg保存到磁盘并释放创建的对象。
基于Delphi环境下MapObjects的使用

基于Delphi环境下MapObjects的使用【摘要】:添加、放大、缩小、漫游、整屏显示、查询等功能是许多地理信息系统的必备功能,鉴于MapObjects在Delphi环境下开发的实例及书籍非常少,为此文章给出了在Delphi环境下使用MapObjects来实现地图的添加、放大、缩小、漫游、整屏显示、查询的代码。
【关键词】:MapObjects; 高级语言Delphi; GIS1.引言随着计算机技术的不断发展,计算速度越来越快。
也使得地理信息系统(GIS)技术应用领域越来越广泛,如测绘、规划、电信线路管理、城市供排水管道管理等。
现在在市场上有许多关于GIS方面的软件出现,有国外的,也有国内开发的软件。
但在有的实际工作中,地图只是应用程序的一部分。
[1]此时,应用开发人员迫切需要一种制图与GIS功能组件,而不是最终的应用软件来定制或扩展已有的应用。
MapObjects正是为了满足这种需要而开发出来的。
它包括一个OLE控件(OCX)叫做地图控件(Map control)和一组(三十多个)OLE 目标(objects)。
MapObjects是一套制图软件集,它使程序员能够把地图加到应用程序中去。
通过MapObjects你可以灵活地建立适合用户的地图接口。
在小内存空间中,你能用多种工业标准程序环境之一去建立应用程序,你能够联合使用MapObjects与其它软件去实现地图与用户信息的联系。
[2]现在介绍MapObjects 在Visual Basic环境下开发的实例及书籍非常多,然而在Delphi环境下MapObjects使用的例子寥寥无几,文章正是针对这一现象,结合一实例,详细介绍如何在Delphi环境下使用MapObjects来实现地图的添加、放大、缩小、漫游、整屏显示、查询等。
2.基于Delphi环境下MapObjects的使用2.1 在应用程序中加入MapObjects和数据(1)安装MapObjects控件。
Delphi实现计算机视觉常用图像处理算法

Delphi实现计算机视觉常用图像处理算法摘要:由于图像处理涉与到了大量的程序编制工作,因此,如何合理选择一种简洁高效的编程工具,减少研究工作中的复杂性,就成为了计算机数字图像处理中不可回避的问题。
本文就利用Delphi实现对计算机视觉中常用图像处理方法。
关键词:计算机视觉;数字图像处理;DelphiThe Algorithms for Image Processing ofComputerVision Implemented in Delphi Abstract:Image processing involves lots ofprogramming. Hence how to select a programming toolwith simplicity andhigh efficiency became an unavoidable problem in computer-based digital image processing. For reference, this articleimplemented the image processing algorithms in common usewith Delph.iKey words:computer vision; digital image processing; Delphi1 引言计算机视觉[1]是采用各种成象系统代替视觉器官作为输入手段,并通过计算机技术来完成替代大脑完成处理和解释任务的一门学科,其最终研究目标就是使计算机能象人那样通过视觉观察和理解世界,具有自主适应环境的能力。
在计算机视觉的发展过程中,图像处理、模式识别、图像理解这一系列相关学科的发展对其有着至关重要的推动作用。
本文中,就将如何利用Delphi开发工具对计算机视觉中应用较多的一些数字图像处理方法进行实现进行详细讨论。
1 Delphi实现技术在Delphi中,专门定义了一组对象和部件用以绘制图形[2],完成一些简单的图像功能。
用Delphi实现图像放大镜

在一些常用的看图软件中都带有一个可以放大局部图像的功能,本实例就是为模仿这一功能开发的。
向窗体上添加两个TImage组件,其中一个TImage组件的Name属性设置为Image1,它充当原图片显示的载体。
另一个TImage组件的Name属性设置为Image2,它可以显示放大后的图像。
添加组件后的窗体如图1所示。
图1 添加组件后的窗体本例的核心是StretchBlt函数,利用StretchBlt函数实现局部图像放大,响应代码如下:procedure TForm1.Image1MouseMove(Sender: TObject; Shift:TShiftState; X, Y: Integer);beginStretchBlt(,0,0,Image2.Width,Image2.Height,, X-20,Y-20,40,40,SRCCOPY);Image2.Refresh;Scr een.Cursors[1]:=LoadCursorFromFile(’MAGNIFY.CUR’);Self.Cursor:=1;end;程序首先会调用StretchBlt函数,以鼠标当前位置作为中心点,以边长为40选中Image1组件上的局部图像,并放大此局部图像到Image2组件上。
然后通过调用Image2组件的Refresh方法以刷新Image2组件的显示。
最后设置鼠标指针为新的形状。
程序代码如下:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics,Controls, Forms,Dialogs, ExtCtrls, StdCtrls;typeTForm1 = class(TForm)Image1: TImage;Image2: TImage;procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;implementation{$R *.dfm}procedureTForm1.Image1MouseMove(Sender:TObject;Shift:TShiftState;X,Y: Integer);beginStretchBlt(,0,0,Image2.Width,Image2.Height,,X-20,Y-20,40,40,SRCCOPY);Image2.Refresh;Screen.Cursors[1]:=LoadCursorFromFile(’MAGNIFY.CUR’);Self.Cursor:=1;end;procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);beginScreen.Cursors[1]:=crDefault;Self.Cursor:=1;end;end.保存文件,然后按F9键运行程序,程序运行结果如图2所示。
图片放大镜效果实现过程详解

图⽚放⼤镜效果实现过程详解由项⽬需要,原⽣写了个详情页图⽚放⼤镜的效果,扔上代码供学习分享,也作为⽇常笔记...效果如图(例⼦中偷偷链了张天猫的图⽚,希望没啥事 -。
-):实现过程教简单,但我们还是从css开始分析,过程如下(图⽚已正⽅形为例):css:/* 图⽚容器 */.imgBox{width: 200px; /* 各位⼤⽼爷们看着办 */height: 200px; /* 各位⼤⽼爷们看着办 */position: relative; /* 必需 */}/* 图⽚标签 */.mainImg{width: 100%; /* 各位⼤⽼爷们看着办,尽量100%好看些[斜眼笑] */height: 100%; /* 各位⼤⽼爷们看着办,尽量100%好看些[斜眼笑] */}/* 遮罩层-既放⼤区域 */.glass{position: absolute; /* 必需 */width: 50px; /* 遮罩层宽度此处是放⼤4倍,所以为200/4=50 */height: 50px; /* 遮罩层⾼度此处是放⼤4倍,所以为200/4=50 */top: -9999px; /* 绝对位置,先放远些 */left: -9999px; /* 绝对位置,先放远些 */cursor: move; /* ⿏标样式,好看些 */background: rgba(0,0,180,0.5); /* 遮罩层样式,好看些 */}/* ⼤图所在的容器 */.imgMax{position: absolute; /* 必需 */overflow: hidden; /* 必需,盖掉超出的⼤图[斜眼笑] */left: 210px; /* 必需,此处为距原图左边10像素 */top: 0; /* 必需,此处为距上边0像素 */width: 200px; /* 放⼤图⽚容器的宽度此处此处是放⼤4倍,为200,保持和原图容器⼀般⼤,若此处为400,则是放⼤2*4倍,那么相应的放⼤图⽚应该是200*4*2=1600 */ height: 200px; /* 放⼤图⽚容器的⾼度此处此处是放⼤4倍,为200,保持和原图容器⼀般⼤,若此处为400,则是放⼤2*4倍,那么相应的放⼤图⽚应该是200*4*2=1600 */ display: none; /* 先隐藏 */}.maxImg{position: absolute; /* 必需 */width: 800px; /* 此处是放⼤4倍,所以为200*4=800 受放⼤图⽚所在的容器影响,规则如上 */height: 800px; /* 此处是放⼤4倍,所以为200*4=800 受放⼤图⽚所在的容器影响,规则如上 */}上⾯css中需要注意的就是⼏个position和缩放⽐例,注意调整下即可写完样式,来看看布局:html:<!-- 图⽚容器 --><div class="J_imgBox imgBox"><!-- 需要放⼤的图⽚-原始图 --><img class="J_mainImg mainImg" src="/bao/uploaded/i7/TB1Xpe_NXXXXXXRXFXXGTq09XXX_035318.jpg_430x430q90.jpg"/><!-- 遮罩-既放⼤的区域 --><div class="J_glass glass"></div><!-- ⼤图的容器 --><div class="J_imgMax imgMax"><!-- ⼤图 --><img class="J_maxImg maxImg"/></div></div>接下来是主要的js代码,⼀如既往的带注解:js:(function(){/* 放⼤镜函数** @imgContainer 需要实现放⼤镜效果的图⽚容器此处是 class 为 J_imgBox 的 div*/function imgZoom(imgContainer){// 取⼤图url,不知道淘宝图⽚规则如何,反正看了详情页的⼤图和⼩图url对⽐,随便写了个替换var imgUrl = imgContainer.querySelector('.J_mainImg').src.replace(/\.(jpg|jpeg|png|gif)(_)(\d+)(x)(\d+)(q90)?/g,'');// 取⼤图标签的节点var maxImg = imgContainer.querySelector('.J_maxImg');// 给该节点的src属性赋值为⼤图的urlmaxImg.src = imgUrl;// 取⼤图所在的容器var maxImgContainer = imgContainer.querySelector('.J_imgMax');// 取遮罩块var glassBlock = imgContainer.querySelector('.J_glass');// 取消放⼤镜效果var hideMaxImg = function(){glassBlock.style.top = '-9999px';glassBlock.style.left = '-9999px';maxImgContainer.style.display = 'none';}// ⿏标移出图⽚区域,取消放⼤镜效果imgContainer.onmouseout = function(event){event.stopPropagation();hideMaxImg();};// ⿏标在图⽚区域内移动事件imgContainer.onmousemove = function(event) {event.stopPropagation();// 取图⽚容器的⼤⼩及其相对于视⼝的位置,需要实时取,所以放在move事件⾥var clientRect = event.currentTarget.getBoundingClientRect();// 获取距⿏标距的上和左的坐标var leftX = event.clientX - clientRect.left;var leftY = event.clientY - clientRect.top;// 动态设置遮罩块的left和top位置这⾥需要减去遮罩层的⼀半,因为⿏标位于遮罩块中⼼点var pointerLeft = leftX - 25;var pointerTop = leftY - 25;// 如果⿏标坐标移动超出原始图⽚区域边缘则取消放⼤镜效果因为这⾥存在快速移动⿏标到⼤图区域时,⿏标仍处在外层的图⽚区域内,并不会触发mouseout事件(虽然中间隔了⼩⼩的间距,但是快速移动仍能产⽣这个bug,如代码下⾯的图所if((pointerLeft+25) > clientRect.width || pointerLeft < 0 - 25 || (pointerTop+25) > clientRect.height || pointerTop < 0 - 25){hideMaxImg();return !1;};// 遮罩块在最左边的时候,⿏标仍在图⽚区域内,可在遮罩块左边缘⾄中⼼线区域内移动,且这时遮罩块为距左0像素if(pointerLeft < 0){pointerLeft = 0;};// 同上右边限制if(pointerLeft > clientRect.width - 50){pointerLeft = clientRect.width - 50;};// 同上顶部限制if(pointerTop < 0){pointerTop = 0;};// 同上底部限制if(pointerTop > clientRect.height - 50){pointerTop = clientRect.height - 50;};// 设置遮罩块的位置glassBlock.style.left = pointerLeft;glassBlock.style.top = pointerTop;// 取遮罩快距离左边的位置和图⽚区域的宽⾼⽐,⽤于计算⼤图偏移距离,展⽰遮罩块所对应的图⽚区域var percentLeft = pointerLeft/clientRect.width;var percentHeight = pointerTop/clientRect.height;// 设置⼤图偏移距离因为其⽗元素存在 overflow:hidden 所以只会展⽰对应区块maxImg.style.left = -(percentLeft*maxImg.clientWidth)+'px';maxImg.style.top = -(percentHeight*maxImg.clientHeight)+'px';};}var elem = document.querySelectorAll('.J_imgBox');elem.forEach(function(item,idx){imgZoom(item)})})()补bug图:看完后是不是觉得简直不要太简单,接下来就来理⼀理以上代码中能够抽取出来在平常开发中⽐较实⽤的知识点:Element.getBoundingClientRect()Element.getBoundingClientRect()⽅法返回元素的⼤⼩及其相对于视⼝的位置例⼦:<body style="width:1400;height:1000"><div id="testDiv" style="width:10px;height:20px;background:#f00"></div><script>(function(){var elem = document.getElementById('testDiv');document.body.addEventListener('click',function(){console.log(elem.getBoundingClientRect())},false)})()</script></body>效果如图:从效果图上不难看出,当我移动视图后再点击body,打印的对象都能够正确返回元素的⼤⼩及其相对于视⼝的位置这个⽅法也可以⽤于实现当某元素滚动到底/顶部时触发对应事件,相当⽅便。
在MFC下实现放大镜

在MFC下实现放大镜一、引言当我们想仔细观察某个细微的东西时,一般都会使用放大镜。
而要看清显示在计算机屏幕上的图片或文字时通常也可以借助于Windows操作系统附带的放大程序来实现。
但该程序只能以固定的放大倍数去进行观看,有时并不能满足我们的需要。
本文就通过MFC基本类库提供的StretchBlt函数来实现对屏幕图象的局部放大,并且可以随意放大、缩小,选取到合适的放大倍数来对图像的细节进行观察。
二、设计与实现本程序主要用来对图像的局部进行可调倍数的放大,应当具有以下主要功能:1. 移动MOUSE放大显示图像的不同部位2. 左击增加放大倍率、右击减少放大倍率。
从光学角度来看,对物体的放大成像是通过把较小的真实物体显示成尺寸较大的虚像来实现的。
因此我们可以用类似的原理,把图像中待放大的区间从较小的显示范围拉伸到一个比较大的显示范围即可达到图像放大的效果,两个区间的比值也就是图像的放大倍率。
可以通过缩小源区间的范围或扩大放大区间的范围来实现放大倍率的调整。
在MFC基本类库中提供有CDC类的StretchBlt函数可以将一幅位图从一个源矩形以一定的光栅操作拷贝到另外一个不同大小的目标矩形中去,因此可以用此函数来实现图象放大的功能,其函数原形声明如下:BOOL StretchBlt( int x, int y, //目标矩形的坐标原点int nWidth, int nHeight, //目标矩形的长度和宽度CDC* pSrcDC, //源设备环境句柄int xSrc, int ySrc, //源矩形的坐标原点int nSrcWidth, int nSrcHeight, //源矩形的长度和宽度DWORD dwRop ); //光栅操作标志当指定的源和目标矩形的宽度或高度不一样时,StretchBlt函数将创建一个位图的镜像。
如果是宽度有变化,就沿x轴创建镜像;如果是高度上有变化就沿y轴创建镜像。
而且该函数可以在内存中对源图象做拉伸或压缩处理后再拷贝到目标矩形中去。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在一些常用的看图软件中都带有一个可以放大局部图像的功能,本实例就是为模仿这一功能开发的。
向窗体上添加两个TImage组件,其中一个TImage组件的Name属性设置为Image1,它充当原图片显示的载体。
另一个TImage组件的Name属性设置为Image2,它可以显示放大后的图像。
添加组件后的窗体如图1所示。
图1添加组件后的窗体
本例的核心是StretchBlt函数,利用StretchBlt函数实现局部图像放大,响应代码如下:
程序首先会调用StretchBlt函数,以鼠标当前位置作为中心点,以边长为40选中Image1组件上的局部图像,并放大此局部图像到Image2组件上。
然后通过调用Image2组件的Refresh方法以刷新Image2组件的显示。
最后设置鼠标指针为新的形状。
程序代码如下:
保存文件,然后按F9键运行程序,程序运行结果如图2所示。
图2程序运行结果
放大图像是一个优秀的看图软件必备的功能,本实例提供了一种非常简便易行的方法,不但代码数量少,而且执行效率高。