【问题标题】:How to get the size of an image in bytes with Delphi?如何使用 Delphi 获取图像的大小(以字节为单位)?
【发布时间】:2009-11-18 17:20:03
【问题描述】:

我的应用有 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;

【问题讨论】:

  • “图像大小”到底是什么意思? TImage 对象的总大小?加载它的原始文件的大小?未压缩的图像数据的大小?
  • 对不起,我的意思是“原始文件的大小”。有一个使用 TMemoryStream 来获取大小的过程,但是我必须为每个丢弃的图像创建一个新对象,那么 TImage 是否有任何属性来显示此信息?再次感谢。

标签: delphi image size byte


【解决方案1】:

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;

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

【讨论】:

    【解决方案2】:

    您可以使用以下函数来执行文件搜索并返回大小。

    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;
    

    【讨论】:

      【解决方案3】:

      废话,如果我没记错的话,这就是你想要的

      // 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/

      【讨论】:

      • 这不是 Rob 的解决方案,只是不够灵活(用 TBitmap 代替 TGraphic),更不安全(无异常安全)?
      猜你喜欢
      • 2015-01-22
      • 1970-01-01
      • 1970-01-01
      • 2013-02-01
      • 2015-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-06
      相关资源
      最近更新 更多