在德尔福中,我在详细信息表中存储了未知数量的图像文件名。这些图像文件可以是位图,Jpeg,PNGS和ICO文件。
随时随地在列表视图或列表框中加载和显示它们的范例/最佳实践是什么?
我认为我需要以某种方式将它们加载到主表的 OnBeforeScroll 事件中的 ImageList,然后将其分配给列表视图。使用的数据库组件是 dbGO。
我只需要显示预定义大小的缩略图(在VCL程序中)。
最简单的方法是使用 TPicture,因为已经实现了不同图形格式的加载,并且您必须关心不同的图像类。
您必须确保所需的单位包含在用途中,例如:此处.jpeg gifimg和pngimg。
使用 TPicture.LoadFromFile 加载后,图像将在准备好的位图上绘制、居中和缩放,具有图像列表的尺寸。
最后一步是简单地调用 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;
未知数字"听起来可能有大量的图像。因此,预渲染的缩略图将非常有帮助。如果您的应用程序可以为所有图像创建缩略图并将它们保存在单独的数据库中,这将减少缩小它们的 CPU 资源使用量。您可以从主数据库中引用缩略图数据库。
我会检查 RAM 是否可能受到限制的一件事是在您的应用程序中将创建多少个实际缩略图的实例,例如,如果您加载 1000 条数据库记录,这些记录都引用相同的缩略图,数据库访问组件是分配 1000 个图像对象(使用 1000 倍于所需 RAM)还是只分配一个, 被引用了 1000 次。此外,图像数据的取消分配也很重要。