delphi 的图片控件如何加载图片呀给下代码或者详细点
答案:2 悬赏:20 手机版
解决时间 2021-02-08 19:44
- 提问者网友:感性作祟
- 2021-02-08 06:35
delphi 的图片控件如何加载图片呀给下代码或者详细点
最佳答案
- 五星知识达人网友:一袍清酒付
- 2021-02-08 07:47
点一下图片控件,然后在控件属性栏找picture属性,点一下就可以换图片了
全部回答
- 1楼网友:独钓一江月
- 2021-02-08 09:15
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;
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯