Seite 2 von 2

Verfasst: 11.09.2006 13:32
von stbi
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:
ich hab das mal so gemacht:

Code: Alles auswählen

#SOI = $FFD8
#EOI = $FFD9
#APP1 = $FFE1

Procedure.w Read2Bytes()
  ProcedureReturn ReadByte()&$FF * 256 + ReadByte()&$FF
EndProcedure


Procedure.l IsJpegExifFormat(dateiname.s)

  ; die ersten zwei Bytes sind SOI,
  ; die letzten zwei Bytes sind EOI
  ; die zweiten zwei Bytes sind APP1
  
  Protected soi.w, app1.w, eoi.w  
  
  If ReadFile(0, dateiname)
  
    FileSeek(0)
    soi = Read2Bytes()
    Debug soi&$FFFF
  
    app1 = Read2Bytes()
    Debug app1&$FFFF
    
    FileSeek(Lof()-2)
    eoi = Read2Bytes()
    Debug eoi&$FFFF
    
    CloseFile(0)
  
    If soi&$FFFF = #SOI And app1&$FFFF = #APP1 And eoi&$FFFF = #EOI
      Debug "It's a JPEG/EXIF!"
      ProcedureReturn 1
    EndIf
  
  EndIf

  ProcedureReturn 0

EndProcedure
Bevor ich jetzt endlos geschlagen werde, weil ich nicht ReadWord() verwendete, sondern eine eigene Prozedur entworfen habe: im EXIF-Format gibt es sowohl Big- als auch Little Endian-Daten. Deshalb habe ich die Leseprozedur abgekoppelt, um darauf reagieren zu können. Nutze ich hier natürlich nicht, habe ich aber vorgesehen..

Verfasst: 12.09.2006 07:53
von Proton
@roherter
Bist du schon weitergekommen ?

Verfasst: 12.09.2006 19:00
von roherter
Ich habe das jetzt mal so gemacht weiß aber nicht ob ich das jetzt richtig gemacht habe?

Code: Alles auswählen

Procedure.w Read2Bytes()
  ProcedureReturn ReadByte(0)&$FF * 256 + ReadByte(0)&$FF
EndProcedure
OpenFile(0,"bad2.jpg")
erg= Read2Bytes()&$FFFF
ergexif=Read2Bytes()&$FFFF
Size=Read2Bytes()&$FFFF;laenge exif
If ergexif=$FFE1
  Debug "exif"
  Debug Size 
EndIf
If erg=$FFD8
  Debug "jup"
EndIf
CloseFile(0)

Verfasst: 12.09.2006 19:40
von roherter
Irgendwas mach ich noch falsch ich will die exif daten bei dem jpg abschneiden(entfernen).

Code: Alles auswählen

Procedure.w Read2Bytes()
  ProcedureReturn ReadByte(0)&$FF * 256 + ReadByte(0)&$FF
EndProcedure

OpenFile(0,"bad2.jpg")
erg= Read2Bytes()&$FFFF
ergexif=Read2Bytes()&$FFFF
Size=ReadWord(0)
If ergexif=$FFE1
  Debug "exif"
  Debug Size 
EndIf
If erg=$FFD8
  Debug "jup"
EndIf
*mem=AllocateMemory(Lof(0)-Size-2)
FileSeek(0,Size+2)
ReadData(0,*mem,Lof(0))

OpenFile(1,"badohneexif.jpg")
WriteByte(1,$FF)
WriteByte(1,$D8)
WriteData(1,*mem,Lof(0)-Size)
CloseFile(1)
CloseFile(0)

Verfasst: 13.09.2006 08:31
von Proton
nein, nein, das funktioniert so nicht. Für die Marker im Header einer
JPG-Datei sind keine festen Plätze reserviert. Da floatet alles. Dafür sind die
Marker aber eindeutig. Die Werte (Data's) nach den Markern können
unterschiedlich lang sein. Manche Header von JPG's sind tausende Bytes
gross, andere kommen mit dem minimum von vielleicht 100 Bytes aus. In
JPG's können ganze Romane stehen.

Hatte mal eine gute Seite im Internet gefunden, die alles schön erklärt hat.
Leider will mir auf die schnelle der Link nicht mehr einfallen. Werde mal
danach suchen und melde mich wieder.