Как получить размер изображения в байтах с Delphi? - PullRequest
1 голос
/ 18 ноября 2009

мое приложение имеет 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 ]

2 голосов
/ 18 ноября 2009

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 голос
/ 18 ноября 2009

блин, если я не ошибаюсь, это то, что вы хотите

// 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/, если ответ будет полезным!

1 голос
/ 18 ноября 2009

Вы можете использовать следующую функцию, чтобы выполнить поиск файла и вернуть размер.

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;
...