Einzelnen Beitrag anzeigen

MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

AW: Dateiinfos lesen (schnellste Variante?)

  Alt 28. Jan 2020, 22:56
Da ich ja immer wieder Infos aus neue Dateitypen lesen möchte, habe ich auch schon daran gedacht, dies als Plugin zu machen. Wie, weiß ich noch nicht. Aber das ist ja die 2. Anlaufstelle. Erst mal muss ich ja einen Datei-Header richtig lesen können. Dafür braucht man Dokumentationen und natürlich "das können"

Ich scheitere schon beim NEF-Format.
Es baut ja auf TIFF auf aber für mich ist das alles noch nicht so einfach.

Ich muss ja von (http://lclevy.free.fr/nef/) den Abschnitt "4.2 IFD#0, subIFD#1" lesen. Aber schaffe nur den Abschnitt "3. IFD#0" … was mir ein wenig klarer erscheint durch eine TIFF-Dokumentation.

Jedenfalls lese ich die Anzahl Tags und in der For-Schleife immer 12 Bytes. So kann hier der Abschnitt "3. IFD#0" gelesen werden.

Hier mal bissl Code. Bin ein wenig am herumprobieren aber hier mal das Zeugs für den normalen IFD Abschnitt. Den eigentlichen Aufbau habe ich im Netz gefunden und probiere gerade herum.

Code:
Type
  TTifHeader = Record
     Signature : Word;  
     Version   : Word;  
     IFD       : DWord;
  End;
  TIDF_Field  = Record
    Tag      : Word;
    FieldType : Word;
    ValCount : DWord;
    ValOffset : DWord;
  End;

VAR
  TifFile   : TFileStream;
  Header    : tTifHeader;
  DirEntries : Word;
  Field     : TIDF_Field;
  Cnt       : Integer;

  TifFile := TFileStream.Create (sFileName, fmOpenRead);
  Try
    TifFile.Read ( Header,8);
    // Prüfen auf TIFF Format (Ist bei NEF gleich)
    If ((Header.Signature = $04949) And (Header.Version = $0002A)) Or
       ((Header.Signature = $04D4D) And (Header.Version = $02A00)) Then
    Begin
      TifFile.Position := Header.IFD;
      TifFile.Read ( DirEntries, 2 ); // Anzahl Tags im ersten IFD
      For Cnt := 1 To DirEntries Do
      Begin
        TifFile.Read (Field,12);
        Case Field.Tag OF
          $0100 : iWidth := Field.ValOffset;
          $0101 : iHeight := Field.ValOffset;
          //  34665  : Break;
        End;
        // If (iWidth<>0) and (iHeight<>0) Then Break;
      End;
    End;
  Finally
    FreeAndNil ( TifFile );
  End;
  Mit Zitat antworten Zitat