![]() |
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:
Falls nicht bitte sagen was falsch läuft.
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; gruss |
AW: Header aus PNG laden
Du liest den Header ja nirgends aus bzw. weißt deinem
Delphi-Quellcode:
Parameter niemals einen Wert zu.
var
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:
schonmal definitiv eine Exception schmeißen wird.
StrToInt('ANIM')
|
AW: Header aus PNG laden
Zitat:
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 |
AW: Header aus PNG laden
Zitat:
Zitat:
Zitat:
|
AW: Header aus PNG laden
So wie der Code oben abgebildet wirft er mir kein Exeption glaube mir das Bitte.
D2010. Zitat:
Am Anfang steht "IHDR" Am Ende steht "ANIM" Der Header ist so korrekt. gruss |
AW: Header aus PNG laden
Zitat:
Delphi-Quellcode:
mit ungültiger Zahl schon eine Exception geschmissen. So oder so ist "ANIM" auf jeden Fall keine Zahl, weshalb
StrToInt
Delphi-Quellcode:
nicht funktionieren kann und in irgendeiner Form fehlschlagen wird.
StrToInt
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:
Delphi-Quellcode:
ans Ende der Datei abzüglich
TFileStream.Seek
Delphi-Quellcode:
springen und den Header direkt mit
SizeOf(TAniHeader)
Delphi-Quellcode:
auslesen.
TFileStream.Read(anih, SizeOf(anih))
|
AW: Header aus PNG laden
Zitat:
Aber ich glaube dir das es falsch ist. Zitat:
gruss |
AW: Header aus PNG laden
Zitat:
Delphi-Quellcode:
denn für einen Wert zurück? Das ist jetzt mal spannend herauszufinden.
StrToInt('ANIM')
|
AW: Header aus PNG laden
Zitat:
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 |
AW: Header aus PNG laden
Zitat:
Delphi-Quellcode:
machst? Würde mich mal interessieren.
ShowMessage(IntToStr(StrToInt('ANIM')))
Zitat:
Delphi-Quellcode:
FileStream := TFilestream.Create(wsFile ,fmopenread or fmShareDenyNone);
try FileStream.Seek(-SizeOf(TAniHeader), soEnd); FileStream.Read(anih, SizeOf(anih)); finally FileStream.Free; end; |
AW: Header aus PNG laden
Zitat:
Da steht 0. Klasse jetzt habe ich den Header. Jetzt muss ich nur noch wissen ob ANIM existiert. Sign ist nur ein Zahlenwert. Noch ein Bild ;) gruss |
AW: Header aus PNG laden
Zitat:
|
AW: Header aus PNG laden
Liste der Anhänge anzeigen (Anzahl: 1)
Das
Delphi-Quellcode:
wirft definitiv eine Exception. Ich habe die Vermutung, dass er die Schleife gar nicht durchläuft und so an die Stelle gar nicht erst kommt.
ShowMessage(IntToStr(StrToInt('ANIM')));
|
AW: Header aus PNG laden
Zitat:
Delphi-Quellcode:
Wirft kein Exception
function TAnimatePng.GetPngAnimation(wsFile: string; var anih: TAniHeader): Bool;
var ByteArray: array of byte; FileStream: TFileStream; IntI: Integer; begin Result := False; ShowMessage(IntToStr(StrToInt('ANIM'))); try FileStream := TFilestream.Create(wsFile ,fmopenread or fmShareDenyNone); FileStream.Seek(-SizeOf(TAniHeader), soEnd); FileStream.Read(anih, SizeOf(anih)); finally FileStream.Free; end; end; Das ist Fakt. Sign ist nur ein Zahlenwert. Wie bekomme ich den jetzt als String? gruss |
AW: Header aus PNG laden
Zitat:
Delphi-Quellcode:
einfach mit dem korrekten Zahlenwert (0x4D494E41) vergleichst.
anih.Sign
Zitat:
Delphi-Quellcode:
bei seiner Konfiguration einfach nur still und heimlich 0 zurück :pale: Kann ich mir auch nicht erklären.
StrToInt
@Emil: Kannst du den MessageBox Code mal noch in einem komplett leeren Projekt testen? Vielleicht hast du an irgendeiner Stelle davor eine Memory Corruption verursacht, die jetzt den Programmfluss in komischer Weise stört. |
AW: Header aus PNG laden
Dann muss er an den Einstellungen zu den Exceptions was verändert haben. Aber ich dachte, die würden sich nur beim Debuggen auswirken und nicht in der Exe.
|
AW: Header aus PNG laden
Zitat:
Dann ist das soweit fertig ... Danke für deine Mühe Zu dem anderen Problem siehe das Pic was ich noch hochgeladen habe. gruss |
AW: Header aus PNG laden
Zitat:
Edit: Leeres Projekt kommt ein Error. In FormCreate Sehr seltsam. gruss |
AW: Header aus PNG laden
Zitat:
Delphi-Quellcode:
Oder alternativ kannst du Sign auch in deinem Record direkt als
if (anih.Sign = $4D494E41) then
begin // Sign = 'ANIM' end
Delphi-Quellcode:
deklarieren und dann die einzelnen Zeichen vergleichen. Ist vermutlich minimal langsamer, aber dafür besser verständlich.
array[0..3] of AnsiChar
Zitat:
|
AW: Header aus PNG laden
Jetzt bin ich auf das leer Projekt gespannt.
|
AW: Header aus PNG laden
Zitat:
|
AW: Header aus PNG laden
Zitat:
Er steht zwar bei Sign aber habe ich eine Garantie das es immer so ist? Zitat:
gruss |
AW: Header aus PNG laden
Das müsste in der Doku zu dem Format stehen.
Das hat mit VCL oder NonVCL nichts zu tun. Du zerschießt dir irgendwo deinen Speichern. |
AW: Header aus PNG laden
Zitat:
Zitat:
Seltsam das nicht mal madExcept darauf anspringt. gruss |
AW: Header aus PNG laden
Das mit der Doku bezog sich auf die Frage, ob der Wert immer der gleiche ist.
Das seltsame verhalten deines Programms, welches keine Exception wirft, obwohl es es tun und das daran liegt, dass du dir irgendwo deinen Speicher zerschossen hat, hat nichts mit VCL oder NonVCL zu tun. |
AW: Header aus PNG laden
Ob im Sign Feld immer 'ANIM' steht, kann dir wirklich nur die Doku sagen. Wenn es dir um den Zahlenwert geht, dann ja, der bleibt gleich. Es ist nur eine Frage der Darstellung:
Code:
Erst als 4-Byte Integer bzw. DWORD, dann als 4 einzelne Bytes und dann als 4 einzelne AnsiChars.
$4D494E41 = $41 $4E $49 $4D = 'A' 'N' 'I' 'M'
|
AW: Header aus PNG laden
Madexcept findet auch keine Code mit dem du dir deinen Speicher zerschießt. Ich würde erst mal alle Warnungen beim Kompilieren beseitigen, wenn denn welche auftauchen.
|
AW: Header aus PNG laden
Zitat:
Dann ist das erledigt. Hätte ich auch drauf kommen müssen das es HEX werte sind ;) Ist schon spät. LOL Zitat:
gruss |
AW: Header aus PNG laden
Zitat:
Delphi-Quellcode:
ausgelöst wurden, aber einen Versuch ist es Wert.
CopyMemory
|
AW: Header aus PNG laden
Dein Code kompiliert ohne Warnungen? Das meinte ich.
|
AW: Header aus PNG laden
Zitat:
Ich habe alles angeschaltet. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz