delphi控件Image加载图片问题

在加载大图片的时候怎么判断图片已经加载完成,能提供代码更加感谢……

Delphi的TImage控件在加载图片的时候,采用的是同步加载的方式。也就是主线程会一直处于阻塞状态,直到TImage.Picture.LoadFromFile加载完毕为止。也就是说,如果你的代码运行到了LoadFromFile之后就代表图片已经加载完成了。当然,因为是同步加载,所以主线程在加载图片时,完全没有机会重绘窗口。所以加载大图片时可能会有卡顿。

如果你确信你需要加载的图片的体积非常大(图片至少要大于5MB)以上,需要异步地加载图片。你可以创建一个新线程,并在这个线程里创建一个TPicture,然后使用TPicture.LoadFromFile(Stream)来加载图片。然后再这个新线程运行完成后,再经由TImage.Picture := 你在线程中创建的Picture; 的方式来将加载完成的图片对象。

示例代码如下:

const
  CM_LoadComplete = WM_USER + 20;

type
  TLoadThread = class(TThread)
  protected
    AnycPic: TPicture;
    procedure Execute; override;
  public
    destructor Destroy; override;
  end;

  TfrmMain = class(TForm)
    Image1: TImage;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
    FThread: TLoadThread;
    procedure CMLoadComplete(var Message: TMessage); message CM_LoadComplete;
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation

uses
  jpeg, pngimage;

{$R *.dfm}

{ TfrmMain }

procedure TfrmMain.Button1Click(Sender: TObject);
begin
  //开始用线程异步加载图像
  if not Assigned(FThread) then
  begin
    FThread := TLoadThread.Create(True); FThread.Resume;
  end
  else
    ShowMessage('图像正在加载中...');
end;

procedure TfrmMain.CMLoadComplete(var Message: TMessage);
begin
  //TPicture异步加载完成,将其设置为Image1的Picture
  Image1.Picture := FThread.AnycPic;
  //终止线程
  FThread.WaitFor; FreeAndNil(FThread);
end;

procedure TfrmMain.FormDestroy(Sender: TObject);
begin
  if Assigned(FThread) then
  begin
    FThread.WaitFor; FThread.Free;
  end;
end;

{ TLoadThread }

destructor TLoadThread.Destroy;
begin
  AnycPic.Free; inherited;
end;

procedure TLoadThread.Execute;
begin
  AnycPic := TPicture.Create;
  AnycPic.LoadFromFile('D:\test1.jpg');
  //如果图像是jpeg则先进行解码工作
  if AnycPic.Graphic is TJPEGImage then
    (AnycPic.Graphic as TJPEGImage).DIBNeeded;
  //将图像提交至主线程,不要使用Synchronize函数,可能会导致主线程锁死
  PostMessage(frmMain.Handle,CM_LoadComplete,0,0);
end;

温馨提示:答案为网友推荐,仅供参考
delphi控件Image加载图片问题
Delphi的TImage控件在加载图片的时候,采用的是同步加载的方式。也就是主线程会一直处于阻塞状态,直到TImage.Picture.LoadFromFile加载完毕为止。也就是说,如果你的代码运行到了LoadFromFile之后就代表图片已经加载完成了。当然,因为是同步加载,所以主线程在加载图片时,完全没有机会重绘窗口。所以

delphiimage多次加载图片后空间不足
1、内存泄漏:当多次加载图片时,如果没有合理地释放已经不再使用的内存,就会导致内存泄漏。这时候可以使用TImage控件,在每次显示图片后及时释放内存,避免内存泄漏。2、图片过大:如果你一次加载的图片过大,可能会导致内存溢出,空间不足等错误。3、重复加载图片:重复加载同一张图片或者相似的图片,可...

delphi中Timage控件动态加载图片
也可以在加载图片之前使用FileExists函数来确认文件是否存在,如下:if FileExists(预测的图片路径) thenbegin \/\/如果文件存在则加载图片 Image1.Picture.LoadFromFile(预测的图片路径);endelsebegin \/\/如果找不到图片。则在这里执行没有图片的提示end;...

Delphi中怎样将图像装入image控件
在Image控件中有一个picture属性,点击属性后面的按钮,就可以弹出装入图片窗口,在窗口中点击LOAD按钮,然后选择图片就可以了。如果想装入gif动画,可以在Delphi7下可以安装一下三方控件 gifimaged7c控件 安装以后Delphi下的Image控件就可以支持gif动画了。

delphi 读取access中保存的图片,并加载到Image控件上,支持多种图片格式...
Image1.Picture.Bitmap.Assign(MyJPEG); \/\/显示在Image中(图片是JPG的转换成BMP)end;另外,建议你图片保存到数据库的时候格式转成JPG的,占用空间少。什么只支持Jpeg的?Image只支持Bmp格式的,而数据库一般存储的是JPEG格式的,JPEG占用空间小(上面一行代码就是把JPEG转成BMP格式,再放到Image中)...

delphi image控件如何根据图片的大小自动缩放并显示
在 delphi 语言中,让 image 控件根据图片的大小自动缩放并显示的步骤如下:1、从 Tool Palette 面板上找到 TImage 控件,并拖放到窗口:2、选中 Image 控件,调整到合适大小,并设置其属性:Anchors 属性:设置让 image 控件的大小随窗体改变而变化,并保持与左、右、上、下的边距不变。Stretch 设置...

在Delphi7中怎样编程,当按下button键后Image里面的图片显示出来。没按...
Image控件有个visible属性,是控制可见还是不可见的,你开始可以把这个属性设置为false(不可见),然后在button的OnClick事件里设置visible := true;procedure TForm1.Button2Click(Sender: TObject);begin image1.Visible := true;end;

...如何将图片数据保存到dat文件里的,然后读取出来,并在Image控件...
ImageName : string;width : integer;height : integer;ImageData : array[0..49,0..49] of byte;end;存图片:procedure TForm1.SaveImage(path: string);var bit : TBitmap;i,j : integer;myImage : array[0..999] of TImageType;FN : string;dat : TFileStream;begin bit := TBit...

delphi 用cxImage控件打开电脑上的图片
procedure TForm1.cxImage1Click(Sender: TObject);begin if OpenDialog1.Execute then begin cxImage1.Picture.LoadFromFile(OpenDialog1.FileName);end;end;

Delphi中如何用Image控件显示网络图片
在窗体添加一个Image,一个IdHttp,一个Button uses Jpeg procedure TForm1.Button1Click(Sender: TObject);var imagestream:TMemoryStream;jpg:TJpegImage;begin imagestream := TMemoryStream.Create();jpg:=TJpegImage.Create;idhttp1.Get('http:\/\/www.ggyy8.com\/Files\/comic\/500x300\/H\/Naruto.jpg'...

相似回答