用image控件画ACDsee样式的缩略图时的问题:只能画出第一张图片!求高手看看。。。。。。。。(50分)

  • 主题发起人 主题发起人 shadow_x
  • 开始时间 开始时间
S

shadow_x

Unregistered / Unconfirmed
GUEST, unregistred user!
+=====================+
file_array[i,j].filepath : 存储图片文件名的数组!
+=====================+
在用f7跟踪时发现可以正常执行语句,但是,在image2上只有第一副的缩略图!
原因如何?
好像,我不动态加载image3时,在formcreate事件中非常正常!

//画缩略图
//------------------------------------------------------------------------------
//要动态创建矩形区域
image2.Height:=row*80 ;
for i:=0 to row -1 do
begin
for j:=0 to 7 do
begin
if (file_array[i,j].filepath <>'')and enabl then
begin
image3.Picture.LoadFromFile(file_array[i,j].filepath);
image2.Canvas.StretchDraw(rect(i*75+12,j*80+2,i*75+12+50,j*80+2+60),image3.Picture.Graphic);
image2.Canvas.TextOut(i*75+(75-image2.canvas.textwidth(format('%12.12s',[file_array[i,j].filename])))div 2,j*80+2+60,format('%12.12s',[file_array[i,j].filename]));
end
else
break;
end
end
 
我觉得你只能得到最后一幅的缩略图,因为每次image2.Canvas.StretchDraw,image2都整个
重画了一遍。
用TImage不是一个好主意,不妨用ListView和ImageList好些。
下面这段是我以前的一个程序中拷下来的,要做一些改动,但大概意思是这样。

procedure TListVThread.Execute;
var i,tw,th:integer; bitmap,map:tbitmap;arect,brect:trect;
begin
with mybook do
begin
listview1.show;
gauge1.Show;
//label4.caption:='共'+inttostr(it);
if not brdone then
begin
filelistbox1.mask:='*.bmp;*.jpg;*.jpeg;*.emf;*.wmf;*.psd;*.pdd;*.tif; *.tiff;*.fax;*.bw;*.rgb;*.rgba;*.sgi;*.cel; *.pic;*.tga; *.vst;*.icb; *.vda; *.win;*.pcx;*.pcc;*.scr;*.pcd;*.ppm;*.pgm;*.pbm;*.cut;*.pal;*.rla;*.rpf;*.rle;*.dib;*.psp;*.png';
filelistbox1.Update;
it:=filelistbox1.Items.Count;
gauge1.MaxValue := it;
listview1.Items.Clear;
imagelist1.Clear;
w:=imagelist1.Width;
h:=imagelist1.height;
arect.Left :=0;
arect.Top :=0;
arect.Right :=w;
arect.Bottom :=h;
brect:=arect;
map := TBitmap.Create;
for i:=1 to it do
begin
s:=filelistbox1.Items[i-1];
image1.picture.LoadFromFile(s);
tw:=image1.Picture.Width;
th:=image1.Picture.height;
Bitmap := TBitmap.Create;
Clipboard.Assign(Image1.Picture);
map.LoadFromClipBoardFormat(cf_BitMap,ClipBoard.GetAsHandle(cf_Bitmap),0);
bitmap.Width :=w;
bitmap.height:=h;
bitmap.Canvas.Rectangle(brect);
if(tw<w)and(th<h) then
bitmap.canvas.Draw(w div 2-tw div 2,h div 2-th div 2,map)
else
begin
if tw>th then
begin
arect.left:=0;
arect.Right:=w;
tem:=round(w*(th/tw));
arect.top:=(h-tem) div 2;
arect.bottom:=arect.top+tem;
end
else
begin
arect.top:=0;
tem:=round(h*(tw/th));
arect.Left :=w div 2- tem div 2;
arect.Right:=arect.left+tem;
arect.bottom:=h;
end;
bitmap.Canvas.StretchDraw(arect,map)
end;
imagelist1.Add(bitmap,bitmap);
listview1.Items.Add;
pi:=i;
synchronize(prog);
//caption:='Isee '+inttostr(round(i/it*100))+'%';
listview1.Items[i-1].imageindex:=i-1;
listview1.Items[i-1].Caption:=s;
end;
caption:='Isee';
//listview1.Cursor:=crdefault;
gauge1.Hide;
gauge1.Progress := 0;
SpeedButton42.Enabled := false;
SpeedButton43.Enabled := false;
SpeedButton26.Enabled := true;
brdone:=true;
statusbar1.panels.items[1].text:='共打开'+inttostr(it)+'个文件 ';
end;
end;
end;
 
我用ListView和ImageList实现了和acdsee98%相似的界面。
 
zw84611:
1。你的建议十分好!!从上面的代码看来,用了线程技术。目前,我没有这方面的能力
2。如果你有线程方面的经验的话。我十分希望得到您的帮助!
3。关于我的这个问题,我发现不能显示的原因是输出‘图片’的位置计算不正确。
改了,还是有小问题!待会儿可能会搞定。
4。你的这篇代码,本人十分喜欢!收藏!
5。待会儿结账。
 
lance2000:
你可以把你的思路或者代码贴上吗?
等待中!
 
用剪贴板来转换图像格式
妙!
宝兰可恶,ImaeList 不能直接调入JPEG等格式的格式的图像文件。真不知怎么想的?垂手
之劳而已。
 
ImaeList!拦脚石!!!
 
E_mail :w3_20@yahoo.com.cn
 
多人接受答案了。
 
后退
顶部