Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Header aus PNG laden (https://www.delphipraxis.net/192148-header-aus-png-laden.html)

EWeiss 23. Mär 2017 01:08


Header aus PNG laden
 
Bin mir jetzt nicht sicher ob das so ok ist.
Es wird zwar True zurückgegeben aber den Headern habe ich deshalb trotzdem nicht.
Wie bekomme ich den?

Delphi-Quellcode:
  AniHeader = Record
    Frame: WORD;
    Width: WORD;
    Height: WORD;
    Speed: WORD;
    offset: dword;
    reserved: dword;
    Sign: dword;
  end;
Delphi-Quellcode:
function TAnimatePng.GetPngAnimation(wsFile: string; var anih: TAniHeader): Bool;
var
  ByteArray: array of byte;
  FileStream: TFileStream;
  IntI: Integer;
begin
  Result := False;
  try
    FileStream := TFilestream.Create(wsFile ,fmopenread or fmShareDenyNone);
    SetLength(ByteArray, FileStream.Size);
    FileStream.Read(ByteArray[0], Length(ByteArray));
  finally
    FileStream.Free;
  end;

  for IntI := Low(ByteArray) to High(ByteArray) do
  begin
    if (ByteArray[IntI] * 4) = StrToInt('ANIM') then
      Result := True
  end;

end;
Falls nicht bitte sagen was falsch läuft.

gruss

Zacherl 23. Mär 2017 01:29

AW: Header aus PNG laden
 
Du liest den Header ja nirgends aus bzw. weißt deinem
Delphi-Quellcode:
var
Parameter niemals einen Wert zu.

Außerdem:
Delphi-Quellcode:
for IntI := Low(ByteArray) to High(ByteArray) do
  begin
    if (ByteArray[IntI] * 4) = StrToInt('ANIM') then
      Result := True
  end;
:?:

Was soll dieser Code bewirken?

Ich kann nur sagen, dass
Delphi-Quellcode:
StrToInt('ANIM')
schonmal definitiv eine Exception schmeißen wird.

EWeiss 23. Mär 2017 01:31

AW: Header aus PNG laden
 
Zitat:

Zitat von Zacherl (Beitrag 1365159)
Du liest den Header ja nirgends aus bzw. weißt deinem
Delphi-Quellcode:
var
Parameter niemals einen Wert zu.

Außerdem:
Delphi-Quellcode:
for IntI := Low(ByteArray) to High(ByteArray) do
  begin
    if (ByteArray[IntI] * 4) = StrToInt('ANIM') then
      Result := True
  end;
:?:

Was soll dieser Code bewirken?

Ich kann nur sagen, dass
Delphi-Quellcode:
StrToInt('ANIM')
schonmal definitiv eine Exception schmeißen wird.

Deswegen frage ich ja was falsch ist. ;)
Nein ein exeption wird nicht geworfen es kommt ein true zurück.

Wie komme ich denn an den Header und kann nach dem anih.Sign := ANIM suchen?
Die Daten sollten sich ja im ByteArray befinden.


gruss

Zacherl 23. Mär 2017 01:33

AW: Header aus PNG laden
 
Zitat:

Zitat von EWeiss (Beitrag 1365160)
Nein ein exeption wird nicht geworfen es kommt ein true zurück.

Dann läuft irgendwas gewaltig schief, denn:
Zitat:

---------------------------
Project1
---------------------------
'ANIM' ist kein gültiger Integerwert.
---------------------------
OK
---------------------------
Zitat:

Zitat von EWeiss (Beitrag 1365160)
Wie komme ich denn an den Header und kann nach dem anih.Sign := ANIM suchen?

Der Header steht genau in der von dir modellierten Form (TAniHeader) direkt am Anfang der Datei?

EWeiss 23. Mär 2017 01:35

AW: Header aus PNG laden
 
So wie der Code oben abgebildet wirft er mir kein Exeption glaube mir das Bitte.
D2010.

Zitat:

Der Header steht genau in der von dir modellierten Form (TAniHeader) direkt am Anfang der Datei?
Nein ganz hinten.

Am Anfang steht "IHDR"
Am Ende steht "ANIM"

Der Header ist so korrekt.

gruss

Zacherl 23. Mär 2017 01:42

AW: Header aus PNG laden
 
Zitat:

Zitat von EWeiss (Beitrag 1365162)
So wie der Code oben abgebildet wirft er mir kein Exeption glaube mir das Bitte.
D2010.

In meiner Erinnerung hat selbst Delphi 7 beim Aufruf von
Delphi-Quellcode:
StrToInt
mit ungültiger Zahl schon eine Exception geschmissen. So oder so ist "ANIM" auf jeden Fall keine Zahl, weshalb
Delphi-Quellcode:
StrToInt
nicht funktionieren kann und in irgendeiner Form fehlschlagen wird.

Aber nur zur Sicherheit:
Der Code wird wirklich ausgeführt und du hast auch keinen Exception Handler um den Aufruf, der die Exception ggfls. abfangen könnte?

Zitat:

Zitat von EWeiss (Beitrag 1365162)
Zitat:

Der Header steht genau in der von dir modellierten Form (TAniHeader) direkt am Anfang der Datei?
Nein ganz hinten

Dann kannst du einfach mit
Delphi-Quellcode:
TFileStream.Seek
ans Ende der Datei abzüglich
Delphi-Quellcode:
SizeOf(TAniHeader)
springen und den Header direkt mit
Delphi-Quellcode:
TFileStream.Read(anih, SizeOf(anih))
auslesen.

EWeiss 23. Mär 2017 01:45

AW: Header aus PNG laden
 
Zitat:

Aber nur zur Sicherheit:
Der Code wird wirklich ausgeführt und du hast auch keinen Exception Handler um den Aufruf, der die Exception ggfls. abfangen könnte?
Ich habe mal MadExcept angeworfen und nein so wie du am bild sehen kann gibt der Compiler True zurück ohne wenn und aber ;)
Aber ich glaube dir das es falsch ist.

Zitat:

Dann kannst du einfach mit TFileStream.Seek ans Ende der Datei abzüglich SizeOf(TAniHeader) springen und den Header direkt mit TFileStream.Read(anih, SizeOf(anih)) auslesen.
Sorry kannst du mir das am Code verbildlichen?

gruss

Zacherl 23. Mär 2017 01:48

AW: Header aus PNG laden
 
Zitat:

Zitat von EWeiss (Beitrag 1365164)
Zitat:

Aber nur zur Sicherheit:
Der Code wird wirklich ausgeführt und du hast auch keinen Exception Handler um den Aufruf, der die Exception ggfls. abfangen könnte?
Ich habe mal MadExcept angeworfen und nein so wie du am bild sehen kann gibt der Compiler True zurück ohne wenn und aber ;)

Das ist interessant :shock: Was gibt
Delphi-Quellcode:
StrToInt('ANIM')
denn für einen Wert zurück? Das ist jetzt mal spannend herauszufinden.

EWeiss 23. Mär 2017 01:50

AW: Header aus PNG laden
 
Zitat:

Zitat von Zacherl (Beitrag 1365165)
Zitat:

Zitat von EWeiss (Beitrag 1365164)
Zitat:

Aber nur zur Sicherheit:
Der Code wird wirklich ausgeführt und du hast auch keinen Exception Handler um den Aufruf, der die Exception ggfls. abfangen könnte?
Ich habe mal MadExcept angeworfen und nein so wie du am bild sehen kann gibt der Compiler True zurück ohne wenn und aber ;)

Das ist interessant :shock: Was gibt
Delphi-Quellcode:
StrToInt('ANIM')
denn für einen Wert zurück? Das ist jetzt mal spannend herauszufinden.

Er durchläuft das Array bis 8 und schaltet dann auf true.
Ausgeben tut er sonst nichts.

Aber wie gesagt es kann nicht richtig sein auch wenn das Ergebnis true ist.
So komme ich nicht an den Header.

Das ist was ich sehe wenn IntI 8 ist.


gruss

Zacherl 23. Mär 2017 01:53

AW: Header aus PNG laden
 
Zitat:

Zitat von EWeiss (Beitrag 1365166)
Zitat:

Zitat von Zacherl (Beitrag 1365165)
Zitat:

Zitat von EWeiss (Beitrag 1365164)
Zitat:

Aber nur zur Sicherheit:
Der Code wird wirklich ausgeführt und du hast auch keinen Exception Handler um den Aufruf, der die Exception ggfls. abfangen könnte?
Ich habe mal MadExcept angeworfen und nein so wie du am bild sehen kann gibt der Compiler True zurück ohne wenn und aber ;)

Das ist interessant :shock: Was gibt
Delphi-Quellcode:
StrToInt('ANIM')
denn für einen Wert zurück? Das ist jetzt mal spannend herauszufinden.

Er durchläuft das Array bis 8 und schaltet dann auf true.
Ausgeben tut er sonst nichts.

Was passiert denn, wenn du mal ganz am Anfang der Funktion testweise ein
Delphi-Quellcode:
ShowMessage(IntToStr(StrToInt('ANIM')))
machst? Würde mich mal interessieren.

Zitat:

Zitat von EWeiss (Beitrag 1365166)
Aber wie gesagt es kann nicht richtig sein auch wenn das Ergebnis true ist.
So komme ich nicht an den Header.

Wenn der Header tatsächlich immer am Dateiende ist, kannst du ihn ganz einfach so auslesen und dir sowohl das Byte-Array, als auch die komische Schleife sparen:
Delphi-Quellcode:
FileStream := TFilestream.Create(wsFile ,fmopenread or fmShareDenyNone);
  try
    FileStream.Seek(-SizeOf(TAniHeader), soEnd);
    FileStream.Read(anih, SizeOf(anih));
  finally
    FileStream.Free;
  end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:54 Uhr.
Seite 1 von 4  1 23     Letzte »    

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