W jaki sposób pobrać wymiary obrazka

Coldpeer

Jak to zrealizować? Można otworzyć obrazek za pomocą klasy TImage i odczytać wymiary obrazka. Poniżej prezentuję taką funkcję:

function GetImageSize(const Path : string) : string;
var Image : TImage;
begin
  if ExtractFileExt(Path) <> '' then
  try
    Image := TImage.Create(nil);
    Image.Picture.LoadFromFile(Path);
    Result := IntToStr(Image.Picture.Width) + 'x' + IntToStr(Image.Picture.Height);
  finally
    Image.Free;
  end;
end;

Powyższa funkcja zwraca wartość w postaci SzerokośćxWysokość. Przedstawiam funkcję, która zwraca tylko wybrane przez nas dane:

function GetImageSize(const Path : string; Height : boolean = False) : integer;
var Image : TImage;
begin
  if ExtractFileExt(Path) <> '' then
  try
    Image := TImage.Create(nil);
    Image.Picture.LoadFromFile(Path);
    if not Height then
      Result := Image.Picture.Width
    else
      Result := Image.Picture.Height;
  finally
    Image.Free;
  end;
end;

Wywołanie wygląda następująco (dla pliku C:\img.jpg):

szerokosc := GetImageSize('C:\img.jpg');
wysokosc := GetImageSize('C:\img.jpg', True);

Standardowo klasa TImage obsługuje takie formaty jak JPG/JPEG czy BMP. Aby obsłużyć formaty GIF czy PNG, należy zainteresować się dodatkowymi modułami jak TGifImage, czy TPngImage - dostępnymi za darmo w internecie).

FAQ

3 komentarzy

Co do drugiej wersji, lepiej imo zwracać TPoint. Masz szerokość i wysokość przy jednym wywołaniu funkcji.

Nie, nie prościej.

Jak będziesz miał listę 100 obrazków, to będziesz w pętli wszystkie ładował i też utrudniał sobie życie? Gdy masz np. dużą listę obrazków, których musisz sprawdzić wymiary i sprawdzasz to wiele razy, w różnych miejscach programu, wtedy taka funkcja się przydaje. I nie musisz wrzucać na formę specjalnie komponentu - Delphi to nie tylko komponenty i klikanie.

PS. co do Twojego kodu, to jak już to Label1.Caption := IntToStr(Image.Picture.Height);

A czy nie prościej jest zrobić taki myk:
W OnCreate czy gdzieś tam:

Image.Visible := false;
Image.Autosize := true;
Image.Picture.LoadFromFile('ścieżka...');
Label1.Caption := Image.Height;
Label2.Caption := Image.Width

Ale trzeba wrzucić Imaga na forme...