如何使用Delphi以字节为单位获取图像的大小?

时间:2009-11-18 17:20:04

标签: delphi image size byte

我的应用程序有3个控件:TThumbnailList(来自TMS组件的图像查看器),TImage和TLabel。我希望当我将图像从TThumbnailList拖到TImage并将其删除时,TLabel对象会显示该图像的大小(以字节为单位)。我怎么得到这个? 提前谢谢。

procedure TForm1.AssignImage;
begin
  //tl: TThumbnailList
  if (tl.ItemIndex>=0) then begin
    Image1.Picture.Assign(tl.Thumbnails.Items[tl.ItemIndex].Picture);
  end;
end;

procedure TForm1.Image1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  if (Source is TThumbnailList) then AssignImage;
end;

procedure TForm1.Image1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState;
  var Accept: Boolean);
begin
  Accept:= Source is TThumbnailList;
end;

3 个答案:

答案 0 :(得分:2)

TImage没有任何方法可以确定在给定时间碰巧保持的任何图形的大小。那不是它的工作。它的工作只是显示的东西。 TGraphic对象管理内存中表示,它还确定如何将自身绘制到给定的画布上。 TImage真的一无所知。 TGraphic可能,但它不一定跟踪文件大小;这可能与将数据存储在内存中所需的内存量不同。

确定文件大小的方法是具有文件或类似文件的内容,例如流。正如您在评论中提到的,您可以将图像保存为流,然后找出流的大小。

function GetGraphicSize(g: TGraphic): Integer;
var
  ms: TStream;
begin
  ms := TMemoryStream.Create;
  try
    g.SaveToStream(ms);
    Result := ms.Size;
  finally
    ms.Free;
  end;
end;

如果每次需要大小时计算成本太高,那么请记住第一次看到图像时的大小,这样您每次都不需要重新计算它。缩略图列表是如何开始其图像的?如果它们来自文件,那么您可以在生成缩略图时简单地获取文件大小。

答案 1 :(得分:1)

您可以使用以下功能执行文件搜索并返回大小。

function FindFileSize(Filename:string):integer;
var
  sr : TSearchRec;
begin
  if FindFirst(filename,faAnyFile-faDirectory,sr) = 0 then
    Result := sr.Size
  else
    raise EFileNotFoundException.Create(filename+' not found.');
  FindClose(sr);
end;

答案 2 :(得分:1)

哎呀,如果我没弄错的话,这就是你想要的

// this will return the size of the bitmap in bytes!
function BitmapSize(ABitmap: TBitmap): Cardinal;
var ms : TMemoryStream;
begin
     ms := TMemoryStream.Create;
     ABitmap.savetostream(ms);
     result := ms.size;
     FreeAndNil(ms);
end;

玩得开心,如果答案有帮助,请不要忘记访问http://delphigeist.blogspot.com/