我是这的程序.放大,缩小已做好了,就差图像漫游了~~
那个高手帮帮忙!~~~unit UShow;     //show pictureinterfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, jpeg, ComCtrls, ImgList, ToolWin;type
  TShowPicture = class(TForm)
    Image1: TImage;
    StatusBar1: TStatusBar;
    ImageList1: TImageList;
    ToolBar1: TToolBar;
    ZoomIn: TToolButton;
    ZoomOut: TToolButton;
    Panel1: TPanel;
    ToolButton1: TToolButton;
    ToolButton2: TToolButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure ZoomInClick(Sender: TObject);
    procedure ZoomOutClick(Sender: TObject);
    procedure ToolButton2Click(Sender: TObject);
  private
    { Private declarations }
    Jpeg:TJPEGImage;  //传递参数
    bmp,backbmp:TBitmap;
    FBeginDragPoint:TPoint;//记录鼠标开始拖动的位置
    FBeginDragSBPoint:TPoint;//记录"中心点"位置
    FBeginDrag:Boolean;//是否以经开始"拖动"  public
    { Public declarations }
    procedure Add(myjpeg:TJPEGImage);
  end;var
  ShowPicture: TShowPicture;implementation{$R *.dfm}
//图像传递
procedure TShowPicture.Add(myjpeg:TJPEGImage);
begin
Jpeg.Assign(myjpeg);
Image1.Picture.Assign(jpeg);
sw:=Image1.Picture.Width;sh:=Image1.Picture.Height;end;procedure TShowPicture.FormCreate(Sender: TObject);
begin
    jpeg:=TJPEGImage.Create;
    bmp:=TBitmap.Create;
    backbmp:=TBitmap.Create;
    PZoom:=1;
    pw:=Image1.Width;ph:=Image1.Height;
    FBeginDrag:=False;
end;procedure TShowPicture.FormDestroy(Sender: TObject);
begin
  Jpeg.Free;
  bmp.Free;
  backbmp.Free;
end;procedure TShowPicture.Image1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  FBeginDrag:=True;
  FBeginDragPoint.X:=X;
  FBeginDragPoint.Y:=Y;end;procedure TShowPicture.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  FBeginDrag:=False;
end;
//图像漫游
procedure TShowPicture.Image1MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
  if not FBeginDrag then exit;end;//放大按钮
procedure TShowPicture.ZoomInClick(Sender: TObject);
begin
//  backbmp:=TBitmap.Create;
//  Image1.Picture.Graphic.Assign(jpeg);
  backbmp.Assign(Image1.Picture.Graphic);
  if Image1.Picture.Graphic.Empty then
  begin
      showmessage('please load picture');
      exit;
  end
  else
  try
    begin
//      Bmp:=TBitmap.Create;
      Bmp.PixelFormat:=pf24bit;
//      bmp.PixelFormat:=jf24Bit;
      if PZoom>=10 then exit;
      inc(PZoom);
//      Image1.AutoSize:=true;
      bmp.Width:=trunc(PZoom*Image1.Picture.Width);
      bmp.Height:=trunc(PZoom*Image1.Picture.Height);
      //保持最大限度不失真
      SetstretchbltMode(Bmp.Canvas.Handle,HalfTone);
      //Copy backbmp to bmp
     Stretchblt(Bmp.Canvas.Handle,0,0,Bmp.Width,bmp.Height,
                 backbmp.Canvas.Handle,0,0,backbmp.Width,backbmp.Height,srCCopy);
     Image1.Picture.Bitmap.Assign(bmp);     StatusBar1.SimpleText:='图像尺寸是:'+IntToStr(bmp.Width)
       +'X'+IntToStr(bmp.Height);
     Bmp.PixelFormat:=pf24bit;
//     bmp.Free;
    end;
  except
    ShowMessage('Memory is not enough');
  end;
end;
//缩小按钮
procedure TShowPicture.ZoomOutClick(Sender: TObject);
begin
//  Bmp:=TBitmap.Create;
//  backbmp.Assign(Image1.Picture.Graphic);
  Bmp.PixelFormat:=pf24bit;
  if PZoom=1 then exit;
  dec(PZoom);
//      Image1.AutoSize:=true;
  bmp.Width:=trunc(Image1.Picture.Width div 2);
  bmp.Height:=trunc(Image1.Picture.Height div 2);
  //保持最大限度不失真
  SetstretchbltMode(Bmp.Canvas.Handle,HalfTone);
  //Copy backbmp to bmp
  Stretchblt(Bmp.Canvas.Handle,0,0,Bmp.Width,bmp.Height,
             backbmp.Canvas.Handle,0,0,backbmp.Width,backbmp.Height,srCCopy);
  Image1.Picture.Bitmap.Assign(bmp);
  StatusBar1.SimpleText:='图像尺寸是:'+IntToStr(bmp.Width)
      +'X'+IntToStr(bmp.Height);
     Bmp.PixelFormat:=pf24bit;
  //   bmp.Free;
end;
end.

解决方案 »

  1.   

    漫游就是像ACDSEE那样,一个图很大,屏幕显示不了,可以通过鼠标拖动看到其它部分~~
      

  2.   

    gdi 或者 gdi+函数应该可以。。不用的话 直接读取 图片文件 根据相对坐标转换也行。
      

  3.   

    没有现成的gdi函数直接实现。如果你的image是放在 TScrollBox 中的,那么你只要实现image的鼠标事件就可以显示不同部分了,显示不同部分是TScrollBox自己的功能。如果你只有一个image控件,就需要手工操作canvas呈现不同部分了,当然,图片仍然只是加载一次,所以速度应该很快。
      

  4.   

    zzzl(不拉拉链) :具体怎么作,详细一点?
    TSCRLLBOX我也是过,可是不行!~~
      

  5.   

    呵呵就你目前的这种结构来说有一个非常简单的方法来实现在Image1上再放一个Image2,用户区域对齐,图层在image1之上然后在image2的的mousemove里写几行代码就可以了if (buttondown)  then
     begin
       Image1.Left:=Image1.Left+(x-oldx);
       Image1.TOP:=Image1.Top+(y-oldy);
     end;
     oldx:=x;
     oldy:=y;buttondown,鼠标按键开关,在mouesedown,mouseup里设置下就好了oldx,oldy,成员变量,纪录上一次鼠标的位置
    代码没测试大概就这样了
      

  6.   

    如果有闪烁打开双缓冲就可以了窗体的DoubleBuffered:=true;
      

  7.   

    procedure TFrmScanConn.FormCreate(Sender: TObject);
    begin
       //self.DoubleBuffered := True;
       scrollbox1.DoubleBuffered :=True;
    end;
    procedure TFrmScanConn.Image1MouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    begin
     if Button=mbLeft then
      begin
        IsMouseDown :=True;
        MouseDownPoint :=Point(x,y);
      end;
    end;
    procedure TFrmScanConn.Image1MouseMove(Sender: TObject; Shift: TShiftState;
      X, Y: Integer);
    begin
     if IsMouseDown then
      begin
        MouseMovePoint :=Point(x,y);
        image1.Left:=image1.Left+MouseMovePoint.x-MouseDownPoint.x;
        image1.Top:=image1.Top+MouseMovePoint.y-MouseDownPoint.y;
      end;
    end;procedure TFrmScanConn.Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
       IsMouseDown :=False;
    end;IsMouseDown是全局变量.