Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Grafik / Sound / Multimedia (https://www.delphipraxis.net/21-library-grafik-sound-multimedia/)
-   -   Delphi Auflösung einer PNG-Datei (https://www.delphipraxis.net/90327-aufloesung-einer-png-datei.html)

yankee 15. Apr 2007 14:50


Auflösung einer PNG-Datei
 
Diese Funktion ermittelt die Auflösung einer PNG-Datei:
Delphi-Quellcode:
uses Types;

function getPNGSize(const datei: string):TSize;
var fs: TFileStream;
    tmp: longint;
begin
  fs :=TFileStream.Create(datei,fmOpenRead);
  fs.Seek($10,soFromBeginning);
  fs.Read(tmp,4);
  asm
    MOV EAX,tmp
    BSWAP EAX
    MOV tmp,EAX
  end;
  result.cx :=tmp;

  fs.Read(tmp,4);
  asm
    MOV EAX,tmp
    BSWAP EAX
    MOV tmp,EAX
  end;
  result.cy :=tmp;
  fs.Free;
end;
Vielleicht hat ja noch jemand eine bessere Alternative für den Assemblerteil, aber es funktioniert so.

Quellen:
- http://www.w3.org/TR/2003/REC-PNG-20031110/
- Trail&Error (mit Unterstützung von HxD und Irfanview)

mirage228 15. Apr 2007 15:02

Re: Auflösung einer PNG-Datei
 
Hi,

Ich würde um den FileStream einen Resourcenschutzblock machen.
Auch würde ich den Schreibstil der Prozedur an einigen Stellen anders machen und außerdem ein Standardresultat vorgeben (mit -1, -1 z.B.).

Delphi-Quellcode:
uses Types;

function GetPNGSize(const FileName: string): TSize;
var
  Fs: TFileStream;
  Tmp: Longint;
begin
  Result.Cx := -1;
  Result.Cy := -1;
  Fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone);
  try
    Fs.Seek($10, soFromBeginning);
    Fs.Read(Tmp, 4);
    asm
      MOV EAX,Tmp
      BSWAP EAX
      MOV Tmp,EAX
    end;
    Result.Cx := Tmp;

    Fs.Read(Tmp, 4);
    asm
      MOV EAX,Tmp
      BSWAP EAX
      MOV Tmp,EAX
    end;
    Result.Cy := Tmp;
  finally
    Fs.Free;
  end;
end;
mfG
mirage228


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz