在Delphi中,我有一个未知数量的图像文件名存储在详细信息表中。这些图像文件可以是Bitmaps,Jpegs,PNGS和ICO文件。
在旅途中加载和显示列表视图或列表框中的范例/最佳做法是什么?
我接受它我会以某种方式需要将它们加载到主表的OnBeforeScroll事件中的ImageList,然后将其分配给listview。使用的数据库组件是dbGO。
我只需要显示预定义大小的缩略图(在VCL程序中)。
答案 0 :(得分:3)
最简单的方法是使用TPicture,因为已经实现了不同图形格式的加载,并且您必须关注不同的图像类。
您必须确保所需的单位包含在使用中,所以这里例如jpeg,gifimg和pngimg
使用TPicture.LoadFromFile加载后,图像将在具有图像列表尺寸的准备好的位图上绘制,居中和缩放。
最后一步是简单地使用Bitmap调用AddBitmap过程,为掩码调用nil。
// make sure you included the needed units
// uses pngImage,jpeg,gifimg;
Procedure LoadImagesFromDataset2ImageList(il: TImageList; DS: TDataset; const FileFieldname: String);
var
P: TPicture;
bmp: TBitmap;
Function CalcRectAndPrepare: TRect; // calculate Rect for here centered/streched output
var // and fill the bitmap with the desired beckground color
f: Double;
begin
bmp.Canvas.Brush.Color := clWhite;
bmp.Canvas.FillRect(Rect(0, 0, bmp.Width, bmp.Height));
if P.Width > P.Height then
f := bmp.Width / P.Width
else
f := bmp.Height / P.Height;
Result.Left := Round(bmp.Width - P.Width * f) div 2;
Result.Top := Round(bmp.Height - P.Height * f) div 2;
Result.Right := bmp.Width - Result.Left;
Result.Bottom := bmp.Height - Result.Top;
end;
begin
P := TPicture.Create;
bmp := TBitmap.Create;
try
bmp.Width := il.Width;
bmp.Height := il.Height;
DS.First;
while not DS.Eof do
begin
if FileExists(DS.Fieldbyname(FileFieldname).asString) then
begin
P.LoadFromFile(DS.Fieldbyname(FileFieldname).asString);
bmp.Canvas.StretchDraw(CalcRectAndPrepare, P.Graphic);
il.Add(bmp, nil);
end;
DS.Next;
end;
finally
P.Free;
bmp.Free;
end;
end;
答案 1 :(得分:1)
“未知号码”听起来可能有大量图像。所以预先渲染的缩略图会非常有用。如果您的应用程序可以为所有图像创建缩略图并将它们保存在单独的数据库中,这将减少CPU资源的使用以缩小它们。您可以从master数据库中引用缩略图数据库。
有一件事我会检查RAM是否可以限制在应用程序中将创建多少实际缩略图实例,例如,如果您加载1000个数据库记录,这些记录都引用相同缩略图,数据库访问组件是否分配1000个图像对象(使用比所需RAM多1000倍)或仅分配一个,引用1000次。此外,图像数据的解除分配也很重要。