如何在拉框放大图片(50分)

  • 主题发起人 主题发起人 jzg2727
  • 开始时间 开始时间
J

jzg2727

Unregistered / Unconfirmed
GUEST, unregistred user!
在image内用鼠标拉框,然后点击鼠标放大被选定的部分,如何实现,请执教
 
在Image的OnMouseDown中记录鼠标的初始位置,在鼠标的ONMouseUp中记录鼠标的结束位置,将这两个位置所围成的Rect与原Image相比,计算放大的倍数,放大后再将图片相对的鼠标点击的位置进行偏移即可。
 
一个完整的例子,你自己稍微修改一下就行了
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.
 
源码都给你了还在顶,什么意思?
 
谢谢你的源码,不过我放了数据库控件就不好用了
 
不会吧,你稍微修改一下就行了,如果有问题你提出来。可以帮你解决的
 
如果方便的话,请你把数据库的控件去掉,直接就给我一个图片放大的源码,谢谢
 
如果你不是jpeg格式的图片把FormCreate过程改为:
procedure TForm1.FormCreate(Sender: TObject);
begin
DoubleBuffered:=true;
Image1.Picture.LoadFromFile('你的图片文件');
end;
其它也可以简化,不过保留也没有问题的
 
yostgxf,有旋转图片的例子吗?
 
十分感谢,我弄好了
 
后退
顶部