0

在 Delphi 中,我在详细信息表中存储了未知数量的图像文件名。这些图像文件可以是位图、Jpegs、PNGS 和 ICO 文件。

在旅途中加载和显示列表视图或列表框中的范例/最佳实践是什么?
我认为我需要以某种方式将它们加载到主表的 OnBeforeScroll 事件中的 ImageList 中,然后将其分配给列表视图。使用的数据库组件是 dbGO。

我只需要显示预定义大小的缩略图(在 VCL 程序中)。

4

2 回答 2

3

最简单的方法是使用 TPicture,因为已经实现了不同图形格式的加载,你必须关心不同的图像类。
您必须确保所需的单位包含在 with 使用中,例如 jpeg、gifimg 和 pngimg。
使用 TPicture.LoadFromFile 加载后,图像将在具有 Imagelist 尺寸的准备好的位图上绘制、居中和缩放。
最后一步是简单地使用 Bitmap 和 nil 调用 AddBitmap 过程作为掩码。

// 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;
于 2014-11-17T18:10:14.577 回答
1

“未知数”听起来可能有大量图像。所以预渲染的缩略图会很有帮助。如果您的应用程序可以为所有图像创建缩略图并将它们保存在单独的数据库中,这将减少用于缩小它们的 CPU 资源使用率。您可以从您的主数据库中引用缩略图数据库。

我要检查的一件事是 RAM 是否可能是一个限制,即在您的应用程序中将创建多少个实际缩略图的实例,例如,如果您加载 1000 个全部引用相同缩略图的数据库记录,数据库访问组件是否分配 1000 个图像对象(使用比需要多 1000 倍的 RAM)或仅一个对象,它被引用 1000 次。图像数据的解除分配也很重要。

于 2014-11-17T15:49:39.433 回答