Seite 1 von 2

Exif-Headerlänge

Verfasst: 11.09.2006 09:56
von roherter
Ich habe folgendes Problem, ich möchte die exif daten vom orginalbild auslesen halt nur die reinen daten keine tags und danach in das bearbeite bild reinschreiben.

Meine fragen :1.Wie kann ich die länge der exif daten auslesen?
2.Wie kann ich auslesen ob das Bild überhaupt exif daten enhält?

Ich hoffe ich habe mich verständlich ausgedrückt. :freak:

Verfasst: 11.09.2006 10:07
von Proton
In der PureArea gibt es eine "ExifLib" zum download.

Verfasst: 11.09.2006 10:09
von Frogger
Aber wenn du es selber auslesen willst, schau dir http://www.exif.org/specifications.html an.

Verfasst: 11.09.2006 10:11
von roherter
Ja das weiß ich aber erstens ist sie alt und zweitens gehts mir nicht um die einzelnen tags sondern nur im die reinen daten?

Verfasst: 11.09.2006 10:12
von stbi
Eine JPG-Datei fängt mit $FFD8 an. Wenn sie EXIF-Daten enthält sind die nächsten zwei Bytes $FFE1. Und im nächsten Word steht dann gleich die Länge der Exif-Daten.

Verfasst: 11.09.2006 10:14
von roherter
Danke @stbi das wars was ich wissen wollte. :allright:
Noch eine kurze frage ab welchen byte muss ich anfangen zu lesen?
Bei mir steht das FFD8 nähmlich nicht dirkt am anfang.

Verfasst: 11.09.2006 12:59
von roherter
Mit einem Hex editor sehe ich die adressen ff d8 aber ich bekomme das mit dem auslesen nicht hin.
Kann mir da mal jemand auf die sprünge helfen? :praise:

Verfasst: 11.09.2006 13:15
von Proton
Nach einem Marker "FF xx" folgen 2 Byte Segmentlänge (inkl.der 2 Byte
Segmentlänge)

Verfasst: 11.09.2006 13:15
von DarkDragon
roherter hat geschrieben:Mit einem Hex editor sehe ich die adressen ff d8 aber ich bekomme das mit dem auslesen nicht hin.
Kann mir da mal jemand auf die sprünge helfen? :praise:
ReadWord(), ReadData()

Verfasst: 11.09.2006 13:28
von Proton
Sorry, wenns nicht ganz zu deinem Problem passt. Der Code ermittelt die
Anzahl Pixel (Höhe * Breite) eines JPEG's. Habs halt zufällig mal vor
einiger Zeit gemacht. Soll nur als Anregung dienen wie es geht.

Code: Alles auswählen

Procedure PicSize(Pfad$)
     Protected B,H,FH1,Pos,FS, ad$,Wert

     If UCase(Left(GetExtensionPart(pfad$),1))="J"
         
          OpenFile(FH1, Pfad$)

          If (ReadByte()&$FF)*256+(ReadByte()&$FF)=$FFD8    ; SOI (Start of Image)
               While Loc()<Lof()
               
                    ; Nächstes Byte beginn eines Markers ($FF)?
                    If ReadByte()&$FF=$FF
                         ;scheint so, nächste Kennzeichnung
                         Wert=ReadByte()&$FF
                         
                         ; prüfen auf $FF, danach folgt nämlich *keine* Segmentlänge
                         If Wert=$FF
                              FileSeek(Loc()-1)
                         Else
                              ; prüfen, ob ImageInformationTable
                              If Wert=$C0 Or Wert=$C2
                                   ReadWord()                                   ; Segmentlänge in Bytes (00 11)
                                   ReadByte()                                   ; ? (08)
                                   B=(ReadByte()&$FF)*256+(ReadByte()&$FF)      ; Breite
                                   H=(ReadByte()&$FF)*256+(ReadByte()&$FF)      ; Höhe

                                   Break
                              
                              ; prüfen, ob "Start of Scan" (SOS)
                              ElseIf Wert=$DA
                                   ; weiterlesen bis $FF
                                   PicSize1:
                                   Repeat
                                        Wert=ReadByte()&$FF
                                   Until Loc()=Lof() Or Wert=$FF
                         
                                   If Loc()=Lof(): Break: EndIf
                         
                                   Wert=ReadByte()&$FF
                                   If Wert=$00:                Goto PicSize1: EndIf  ; $FF 00 normales Datum
                                   If Wert=>$D0 And Wert<=$D7: Goto PicSize1: EndIf  ; $FF D0-D7 Restart Marker
                         
                              EndIf

                              FileSeek(Loc()-2+(ReadByte()&$FF)*256+(ReadByte()&$FF))    ; Segmentlänge überspringen
                              ;FileSeek(Loc()+sprung-2)
                              ;Debug "Sprung nach $FFDA= "+Hex(sprung)
                         EndIf
                    EndIf
                Wend

          EndIf
          
          PicSizeEnd1:
          CloseFile(FH1)
          
          ProcedureReturn B*H
     
     Else
          ProcedureReturn 200000
     EndIf
          
EndProcedure