AGB  ·  Datenschutz  ·  Impressum  







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

Header aus PNG laden

Ein Thema von EWeiss · begonnen am 23. Mär 2017 · letzter Beitrag vom 23. Mär 2017
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
EWeiss
(Gast)

n/a Beiträge
 
#1

Header aus PNG laden

  Alt 23. Mär 2017, 02:08
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

Geändert von EWeiss (23. Mär 2017 um 02:11 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: Header aus PNG laden

  Alt 23. Mär 2017, 02:29
Du liest den Header ja nirgends aus bzw. weißt deinem 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 StrToInt('ANIM') schonmal definitiv eine Exception schmeißen wird.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Header aus PNG laden

  Alt 23. Mär 2017, 02:31
Du liest den Header ja nirgends aus bzw. weißt deinem 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 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

Geändert von EWeiss (23. Mär 2017 um 02:34 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

AW: Header aus PNG laden

  Alt 23. Mär 2017, 02:33
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
---------------------------
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?
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Header aus PNG laden

  Alt 23. Mär 2017, 02:35
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

Geändert von EWeiss (11. Jul 2019 um 16:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

AW: Header aus PNG laden

  Alt 23. Mär 2017, 02:42
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 StrToInt mit ungültiger Zahl schon eine Exception geschmissen. So oder so ist "ANIM" auf jeden Fall keine Zahl, weshalb 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:
Der Header steht genau in der von dir modellierten Form (TAniHeader) direkt am Anfang der Datei?
Nein ganz hinten
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.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: Header aus PNG laden

  Alt 23. Mär 2017, 02:45
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

Geändert von EWeiss (11. Jul 2019 um 16:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#8

AW: Header aus PNG laden

  Alt 23. Mär 2017, 02:48
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 Was gibt StrToInt('ANIM') denn für einen Wert zurück? Das ist jetzt mal spannend herauszufinden.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: Header aus PNG laden

  Alt 23. Mär 2017, 02:50
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 Was gibt 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

Geändert von EWeiss (11. Jul 2019 um 16:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#10

AW: Header aus PNG laden

  Alt 23. Mär 2017, 02:53
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 Was gibt 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 ShowMessage(IntToStr(StrToInt('ANIM'))) machst? Würde mich mal interessieren.

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;
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


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 20:00 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