![]() |
Stream schnell durchsuchen
Irgendwie klappt heute nicht allzuviel allzu gut :wink:
3 Threads an einem Abend gab's bei mir noch nie. Folgendes: Ich versuche das Thumb aus einem RAW-Photo zu extrahieren. Die Bilddaten beginnen dabei beim Offset $2600. Um das Ende des JPEG-Thumbs zu finden, durchsuche ich folgend dann den Stream nach "$FF$D9". Klappt auch soweit ganz gut. Allerdings dauert das ganze bei meiner Implementation ewig lange. Es muss doch irgendeine schnellere Möglichkeit geben oder mein Code sollte sich zumindest optimieren lassen. Hat irgendeiner eine Idee? Hier der Quellcode:
Delphi-Quellcode:
procedure TImgViewerForm.LoadCR2Thumb(const AFileName: String);
var FS: TFileStream; MS: TMemoryStream; B: Byte; JPG: TJpegImage; c: Integer; begin FS := TFileStream.Create(AFileName, fmOpenRead); FS.Seek($2600, soFromBeginning); MS := TMemoryStream.Create; while True do begin FS.Read(B, 1); if B = $FF then begin FS.Read(B, 1); Inc(c); if B = $D9 then begin c := FS.Position - $2600; Break; end; end; if (FS.Position = FS.Size) then Exit; end; FS.Seek($2600, soFromBeginning); // Ab hier geht dann alles ganz schnell. Nur die vorangehende Schleife ist super lahm. MS.CopyFrom(FS, c); MS.Seek(0, soBeginning); JPG := TJPEGImage.Create; JPG.LoadFromStream(MS); Img.Picture.Assign(JPG); JPG.Free; MS.Free; FS.Free; end; |
Re: Stream schnell durchsuchen
Arbeite mit ReadBuffer und wähle einen entsprechend großen Buffer.
|
Re: Stream schnell durchsuchen
Aber wie erkenne ich dann die Zeichen FFD9?
Dann müsste ich ja den Buffer auch wieder durchsuchen. Und dass würde das ganze doch auch nicht schneller machen oder? |
Re: Stream schnell durchsuchen
Aber den Buffer im Speicher durchsucht du schneller, als wenn du jedes Byte einzeln liest und vergleichst.
|
Re: Stream schnell durchsuchen
Du hast recht.
Ich lese jetzt jeweils 1000 Bytes aus und es geht echt fix. Danke! |
Re: Stream schnell durchsuchen
Zitat:
Wollte auf diese Fehlerquelle mal hinweisen... |
Re: Stream schnell durchsuchen
Jupp hab dran gedacht.
Wenn das letzte Byte $FF ist, dann lade ich ausnahmsweise doch noch ein Byte mehr und kontrolliere, ob dieses den Wert $D9 hat. |
Re: Stream schnell durchsuchen
Hi,
ich bin mir da nicht sicher, aber vielleicht würd es auch etwas bringen, die Daten gleich in einen stringstream zu lesen und den string zu untersuchen, anschliessend sind die Daten schon im Speicher. grüsse, der flossinger |
DP-Maintenance
Dieses Thema wurde von "SirThornberry" von "Multimedia" nach "Object-Pascal / Delphi-Language" verschoben.
|
Re: Stream schnell durchsuchen
Hallo!
Warum versucht hier eigentlich jeder das mit Streams zu lösen? Wie wäre es mit:
Delphi-Quellcode:
Frank :coder:var Buffer : array of byte; f : file; begin assignfile(f,Datei); setlength(Buffer,filesize(f)); reset(f,1); Blockread(F,Buffer[0]); Closefile(f); // Suchen... end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:47 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