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.

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.

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?

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?

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