AGB  ·  Datenschutz  ·  Impressum  







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

Stream schnell durchsuchen

Ein Thema von Hador · begonnen am 26. Nov 2006 · letzter Beitrag vom 27. Nov 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Hador
Hador

Registriert seit: 11. Dez 2004
Ort: Recke
682 Beiträge
 
Turbo Delphi für Win32
 
#1

Stream schnell durchsuchen

  Alt 26. Nov 2006, 22:43
Irgendwie klappt heute nicht allzuviel allzu gut
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;
Lars Kiesow
http://www.larskiesow.de

Computer gehorchen deinen Befehlen, nicht deinen Absichten.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Stream schnell durchsuchen

  Alt 26. Nov 2006, 22:45
Arbeite mit ReadBuffer und wähle einen entsprechend großen Buffer.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Hador
Hador

Registriert seit: 11. Dez 2004
Ort: Recke
682 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Stream schnell durchsuchen

  Alt 26. Nov 2006, 22:46
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?
Lars Kiesow
http://www.larskiesow.de

Computer gehorchen deinen Befehlen, nicht deinen Absichten.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Stream schnell durchsuchen

  Alt 26. Nov 2006, 22:54
Aber den Buffer im Speicher durchsucht du schneller, als wenn du jedes Byte einzeln liest und vergleichst.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Hador
Hador

Registriert seit: 11. Dez 2004
Ort: Recke
682 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Stream schnell durchsuchen

  Alt 26. Nov 2006, 23:10
Du hast recht.
Ich lese jetzt jeweils 1000 Bytes aus und es geht echt fix.
Danke!
Lars Kiesow
http://www.larskiesow.de

Computer gehorchen deinen Befehlen, nicht deinen Absichten.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: Stream schnell durchsuchen

  Alt 26. Nov 2006, 23:46
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...
  Mit Zitat antworten Zitat
Benutzerbild von Hador
Hador

Registriert seit: 11. Dez 2004
Ort: Recke
682 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Stream schnell durchsuchen

  Alt 26. Nov 2006, 23:48
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.
Lars Kiesow
http://www.larskiesow.de

Computer gehorchen deinen Befehlen, nicht deinen Absichten.
  Mit Zitat antworten Zitat
flossinger

Registriert seit: 22. Aug 2005
Ort: südlich der Alpen
109 Beiträge
 
Delphi 5 Standard
 
#8

Re: Stream schnell durchsuchen

  Alt 27. Nov 2006, 03:51
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
  Mit Zitat antworten Zitat
27. Nov 2006, 06:13
Dieses Thema wurde von "SirThornberry" von "Multimedia" nach "Object-Pascal / Delphi-Language" verschoben.
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.130 Beiträge
 
Delphi 10.3 Rio
 
#10

Re: Stream schnell durchsuchen

  Alt 27. Nov 2006, 07:21
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 02:07 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