Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Stream schnell durchsuchen (https://www.delphipraxis.net/81413-stream-schnell-durchsuchen.html)

Hador 26. Nov 2006 22:43


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;

Luckie 26. Nov 2006 22:45

Re: Stream schnell durchsuchen
 
Arbeite mit ReadBuffer und wähle einen entsprechend großen Buffer.

Hador 26. Nov 2006 22:46

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?

Luckie 26. Nov 2006 22:54

Re: Stream schnell durchsuchen
 
Aber den Buffer im Speicher durchsucht du schneller, als wenn du jedes Byte einzeln liest und vergleichst.

Hador 26. Nov 2006 23:10

Re: Stream schnell durchsuchen
 
Du hast recht.
Ich lese jetzt jeweils 1000 Bytes aus und es geht echt fix.
Danke!

Muetze1 26. Nov 2006 23:46

Re: Stream schnell durchsuchen
 
Zitat:

Zitat von Hador
Du hast recht.
Ich lese jetzt jeweils 1000 Bytes aus und es geht echt fix.
Danke!

Bedenkst du bei deiner Implementation auch, dass der Buffer dein gesuchtes Word genau halbieren kann? Also letztes Bytes des einen Buffers = FF und erstes Byte des folgenden Buffers = D9?

Wollte auf diese Fehlerquelle mal hinweisen...

Hador 26. Nov 2006 23:48

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.

flossinger 27. Nov 2006 03:51

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 27. Nov 2006 06:13

DP-Maintenance
 
Dieses Thema wurde von "SirThornberry" von "Multimedia" nach "Object-Pascal / Delphi-Language" verschoben.

Mavarik 27. Nov 2006 07:21

Re: Stream schnell durchsuchen
 
Hallo!

Warum versucht hier eigentlich jeder das mit Streams zu lösen?

Wie wäre es mit:

Delphi-Quellcode:

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;
Frank :coder:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:47 Uhr.
Seite 1 von 2  1 2      

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