AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Auflösung einer PNG-Datei

Ein Thema von yankee · begonnen am 15. Apr 2007 · letzter Beitrag vom 15. Apr 2007
Antwort Antwort
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#1

Auflösung einer PNG-Datei

  Alt 15. Apr 2007, 15:50
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)
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Auflösung einer PNG-Datei

  Alt 15. Apr 2007, 16:02
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
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Antwort Antwort

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:18 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