如何实现图片框选放大效果? ((yostgxf进来!!!)) (100分)

感谢大家啊,特别感谢yostgxf。现在目的实现了。


不过,拖动鼠标的时候出现一个虚线框的效果又该怎么做呢?也就是拖动的时候,虚线框随着鼠标的移动而变大变小,这样可人性比较好。
 
拖动鼠标的时候出现一个虚线框:
var
IsDraw:Boolean;
pts:array[0..1]of TPoint;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
pts[0]:= Point(X, Y);
pts[1]:= Point(X, Y);
IsDraw:=true;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if IsDraw then
with image1.Canvas do
begin
Pen.Style:= psDot;
Pen.Color:= clGray;
Pen.Mode := pmNotXor;
Rectangle(pts[0].X, pts[0].Y, pts[1].X, pts[1].Y);
Rectangle(pts[0].X, pts[0].Y, X, Y);
pts[1] := Point(X, Y);
Pen.Mode := pmCopy;
end;
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if IsDraw then
with image1.Canvas do
begin
Pen.Mode := pmNotXor;
Rectangle(pts[0].X, pts[0].Y, X, Y);
IsDraw:=false;
end;
end;
 
G32里面有个例子程序,可以实现放大镜的功能
 
感谢yostgxf兄。就是用jpg图像的时候会出错呢,如何解决呢?我现在的jpg图片有1200多张,都在一个光盘上,格式转换不行啊,装不下了。
 
你的问题已经拖了很久了,说实话我都不是很了解你的需求。
如果需要把jpg图像在image图片中显示出来,可以这样:
uses jpeg;
var
jpgimage: Tjpegimage;
showimage: Timage;
begin
...
jpgimage:=Tjpegimage.Create;
jpgimage.LoadFromFile('XXX.jpg');
showimage:=timage.Create(owner);
showimage.Picture.Bitmap.Assign(jpgimage);
jpgimage.free;
...
end;
 
我知道问题拖了很久,可是一直没有合适的解决方法啊,而且后面的问题都是拖带出来的,我也没有办法。

<red>我的jpg图形已经显示出来了,现在唯一的问题是:图像放大功能对于bitmap没有问题,不过不支持jpg格式,只要一实行鼠标框选,出现的错误代码是:“Can only modify an image if it contains a bitmap”。如何解决这个问题呢?</red>
 
我先看看,可能不知道
 
以下为代码:

http://www.km520.com/download/admin/delphi/room2.rar
 
现在的情况似乎是,TImage.picture直接装入jpeg,就无法访问TImage.Canvas(我做了试验,就是如此)

Var
JPEGImage: TJPEGImage;

Bitmap: TBitmap;

//先读入jpeg格式的图片
JPEGImage := TJPEGImage.Create;
JPEGImage.LoadFromFile(Filename);

//建立Bitmap位图对象
Bitmap:= TBitmap.Create;

//将前者转成后者的格式
Bitmap.Height := JPEGImage.Height;
Bitmap .Width := JPEGImage.Width;
Bitmap.PixelFormat := pf24bit;
Bitmap.Canvas.Draw(0,0, JPEGImage)

//此时将bitmap赋给,就能操纵TImage.Canvas了 , 上面的BitMap应该也可以直接用TImage.Picture.Bitmap代替
Timage.Picture.Graphic := Bitmap;
 
框选放大效果实现了,jpg放大问题刘兄也已经帮助解决了,现在的问题是:如果一副图片大小超越了Timage组件的大小的话(为了保证调入的图像全部显示,设置autosize为false,stretch为true),鼠标框选范围就不准了呢?怎么样来解决呢?
以下为代码下载地址:
http://www.km520.com/download/lmz/zoom3.rar
 
我帮你看看,你想选择一块区域让它放大成全屏,双击后关闭放大的图像,是吗?
 
不成全屏,就是充满image2的范围就可以了。好像你写的代码是截取mouse在image1上的位置,我想可以不可以截取mouse在屏幕上的位置,这样才够准确。你可以看一下我写的代码,这样问题你就清楚了。
 
因为autosize为false,所以你那图片已经放大显示了(这里是变宽了),所以可能比例有问题。
我再看看,对了,昨天你那zoom2.rar你那边还有吗?
 
就是存在这个问题。
 
没二句代码就把你折腾的这样,够苦了[:(]
下班后一定帮你,要不刘兄先帮忙看看。
 
哈,是啊,头都冒汗了。
 
帮你看了一下,快搞定了。
现在在给你优化,并加点注释。
 
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.
 
呵呵,还是yostgxf兄厉害!佩服! [:)]
 
哈哈,楼主该请客了
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
873
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
顶部