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

D

dogood

Unregistered / Unconfirmed
GUEST, unregistred user!
如何实现一副jpg图这样的实时框选缩放效果?
question:
框选放大效果实现了,jpg放大问题刘兄也已经帮助解决了,现在的问题是:如果一副图片大小超越了Timage组件的大小的话(为了保证调入的图像全部显示,设置autosize为false,stretch为true),鼠标框选范围就不准了呢?怎么样来解决呢?

以下为代码下载地址:
http://www.km520.com/download/lmz/zoom3.rar
 
用TImage放置图片,将其stretch属性设为true,这样就只需要改变TImage的width和heigh
属性就可以达到缩放效果。
 
canvas.CopyRect();
小区域拷贝到大的区域,就可以达到放大的效果。
反之,缩小
 
stretch属性设为true,
改变TImage的width和heigh
 
那鼠标事件应该怎么来写呢?
 
楼上的已经说的分清除了啊!
剩下的就是图象的比例问题,应该不是什么难题
 
这个我知道的,实现点击某个按钮以后图片的缩放我会啊。可是现在的问题是:
[red]如何实现框选范围的放大?具体的代码应该如何来写?[/red]
 
实现图象局部放大的原理和方法
http://www.china-askpro.com/msg15/qa88.shtml
Delphi学习:图像放大漫游攻略
http://www.pconline.com.cn/pcedu/empolder/gj/delphi/0312/255436.html
 
急啊,我照各位老大的意思做了出来,效果和源文件是这样的:

http://www.km520.com/download/admin/delphi/zoom.rar

我的问题是:
1)通过鼠标框选出图片的一个范围,这个范围放大;双击放大以后的图片,返回原始大小图片。
2)代码好像不支持jpg格式图片,只支持bmp。而我缩放的是jpg格式。
 
下了看了一下,老兄的代码实在不敢恭维。
你看一下app2001介绍的二个网页
 
晕,我就是按照那两个网页介绍的来做的啊。拜托啊,哪位大哥能否给个例子来看看先?
 
http://www.2ccc.com/article.asp?articleid=667
 
to dogood:
jpg<=>bmp的方法如下:
if opendialog1.Execute then
begin
fileext:=uppercase(extractfileext(opendialog1.filename));
if fileext='.JPG' then
begin
ajpeg:=tjpegimage.create;
ajpeg.loadfromfile(opendialog1.FileName);
bitmap:=tbitmap.Create;
bitmap.Assign(ajpeg);
image1.Picture.graphic:=bitmap;
image1.Width:=bitmap.Width;
image1.Height:=bitmap.Height;
bitmap.Free;
end;
 
还没解决吗?给你一个简单的例子
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
isDraw:=true;
image2.Visible:=true;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if isDraw then
begin
ARect:=Rect(X-10, Y-10, X+10, Y+10);
BRect:=Rect(0, 0, 40, 40);
image2.Canvas.CopyRect(BRect, Image1.Canvas, ARect);
image2.Top:=image1.Top+Y-20;
image2.Left:=image1.Left+X-20;
end;

end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
isDraw:=false;
image2.Visible:=false;
end;
 
测试中。。。。。
 
楼上的isDraw,Arect,Brect在什么地方定义呢?
 
在窗体类变量中定义就行了(private中)

var
isDraw:Boolean;
Arect,Brect:TRect;
 
多谢啊,看了一下,不过不是我要的效果啊。大家都应该用过图形处理软件比如photoshop,用放大镜框选一个范围,这个范围的东西就放大,我要的就是这样的效果。
 
你要什么效果是你设计的问题,在这里只能跟你讨论实现的方法
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls, Registry;

type
TForm1 = class(TForm)
Timer1: TTimer;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
procedure Timer1Timer(Sender: TObject);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormDeactivate(Sender: TObject);
procedure LoadSize;
private
{ Private declarations }
public
{ Public declarations }
Hold, First: boolean;
Factor: Word;
ScreenImg: TBitmap;
end;
{
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long
}
var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Timer1Timer(Sender: TObject);
var
tempPoint: TPoint;
tempDc: hDc;
tempWnd: hWnd;
begin
if not Hold then begin
exit;
end;
if First then begin
// 隐藏窗口,保存屏幕画面,以后无论移动到哪里,都可以正确显示
tempWnd:= GetDesktopWindow;
tempDc:= GetDc(tempWnd);
BitBlt( ScreenImg.Canvas.Handle, Width, Height, ScreenImg.Width, ScreenImg.Height,
tempDc, 0, 0, SRCCOPY);
releaseDc(tempWnd, tempDc);
Visible:= true;
First:= false;
exit;
end;
if Hold then begin
GetCursorPos(tempPoint);
Left:= tempPoint.x- Width div 2;
Top:= tempPoint.y- Height div 2;
//BitBlt( Canvas.Handle, 0, 0, Width, Height,
// ScreenImg.Canvas.Handle, Left, Top, SRCCOPY);
StretchBlt( Canvas.Handle, 0, 0, Width, Height,
ScreenImg.Canvas.Handle, Width+ tempPoint.x- Width div 2 div Factor, Height+ tempPoint.y- Height div 2 div Factor, Width div Factor, Height div Factor, SRCCOPY);
end;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button= mbLeft then begin
if Hold then begin
Timer1.Enabled:= false;
Hold:= false;
refresh;
end else begin
Hold:= true;
Visible:= false;
First:= true;
Timer1.Enabled:= true;
end;
end else begin
application.Terminate;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Hold:= false;
LoadSize;
ScreenImg:= TBitmap.Create;
ScreenImg.Width:= Screen.Width+ Width* 2;
ScreenImg.Height:= Screen.Height+ Height* 2;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
ScreenImg.Free;
end;

procedure TForm1.LoadSize;
var
Reg: TRegistry;
begin
Reg := TRegistry.Create;
Factor:= 2;
try
Reg.RootKey := HKEY_CURRENT_USER;
if Reg.OpenKey('/Software/Glass/', false) then begin
Width:= Reg.ReadInteger('Width');
Height:= Reg.ReadInteger('Height');
Factor:= Reg.ReadInteger('Factor');
if Factor< 2 then begin
Factor:= 2;
end;
end else if Reg.OpenKey('/Software/Glass/', true) then begin
Reg.WriteInteger('Width', Width);
Reg.WriteInteger('Height', Height);
Reg.WriteInteger('Factor', 2);
Factor:= 2;
end;
except
end;

Reg.CloseKey;
Reg.Free;
end;

procedure TForm1.FormDeactivate(Sender: TObject);
begin
if not Hold then begin
exit;
end;
Timer1.Enabled:= false;
Hold:= false;
refresh;

end;

end.
别人的东东,你看看吧
 

Similar threads

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