一个完整的例子,你自己稍微修改一下就行了
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, jpeg, StdCtrls, DB, ADODB, Mask, DBCtrls, Math;
type
TForm1 = class(TForm)
Image1: TImage;
Image2: TImage;
fa: TADOQuery;
DBEdit1: TDBEdit;
DataSource1: TDataSource;
procedure Image2DblClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
isDraw :Boolean;
ImageZoomX, ImageZoomY : Single;
pts :array[0..1]of TPoint;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Image2DblClick(Sender: TObject);
begin
image2.Visible:=false;
image1.Visible:=true;
end;
procedure TForm1.FormCreate(Sender: TObject);
Var
JPEGImage: TJPEGImage;
begin
DoubleBuffered:=true;
//先读入jpeg格式的图片
fa.open;
fa.first;
JPEGImage := TJPEGImage.Create;
JPEGImage.LoadFromFile(extractfilepath(paramstr(0))+'data/'+dbedit1.text+'.jpg');
Image1.Picture.Bitmap.Assign(JPEGImage); //1句话就够了,以前的代码太复杂并且没有释放内存
JPEGImage.Free;
end;
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ImageZoomX:=Image1.Picture.Width/Image1.Width;
ImageZoomY:=Image1.Picture.Height/Image1.Height;
isDraw:=true;
pts[0]:= Point(Round(X*ImageZoomX), Round(Y*ImageZoomY));
pts[1]:= Point(Round(X*ImageZoomX), Round(Y*ImageZoomY));
end;
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if IsDraw then
with Image1.Canvas do
begin
Pen.Width:= Max(Round(ImageZoomX), Round(ImageZoomY));
Pen.Color:= clGreen;
Pen.Style:= psDot;
Pen.Mode := pmNotXor;
Brush.Style:= bsClear;
Rectangle(pts[0].X, pts[0].Y, pts[1].X, pts[1].Y);
Rectangle(pts[0].X, pts[0].Y, Round(X*ImageZoomX), Round(Y*ImageZoomY));
pts[1] := Point(Round(X*ImageZoomX), Round(Y*ImageZoomY));
Pen.Mode := pmCopy;
end;
end;
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
ARect :TRect;
begin
if IsDraw then
begin
ARect:=Rect(pts[0].X, pts[0].Y, Round(X*ImageZoomX), Round(Y*ImageZoomY));
with image1.Canvas do
begin
Pen.Mode := pmNotXor;
Rectangle(ARect);
Pen.Mode := pmCopy;
end;
Image2.BoundsRect:=Image1.BoundsRect;
image2.Canvas.CopyRect(Image2.BoundsRect, Image1.Canvas, ARect);
image1.Visible:=false;
image2.Visible:=true;
IsDraw:=false;
end;
end;
end.