Exif-Headerlänge

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
stbi
Beiträge: 685
Registriert: 31.08.2004 15:39
Wohnort: Cleverly Hills

Beitrag 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..
PB 4.02 XP Pro SP2 "Der Code ist willig, aber der Prozessor ist schwach."

Es gibt keine Vista-Witze. Es ist alles wahr!
Benutzeravatar
Proton
Beiträge: 152
Registriert: 20.06.2006 12:21
Wohnort: Eckernförde /Stadtbergen

Beitrag von Proton »

@roherter
Bist du schon weitergekommen ?
Zitat:
"Ich kann mich vor die Meute stellen und für Nichts kämpfen. Ich kann aber auch einen Schritt zur Seite gehen, die Meute vorbeiziehen lassen und dabei meine Zeit angenehm bei Freunden verbringen.". Da hat er Recht, mein Pap's.
Benutzeravatar
roherter
Beiträge: 1407
Registriert: 10.04.2005 18:58
Kontaktdaten:

Beitrag 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)
Purebasic 5.0 32bit und 64 bit

I'm back from hell
Benutzeravatar
roherter
Beiträge: 1407
Registriert: 10.04.2005 18:58
Kontaktdaten:

Beitrag 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)
Purebasic 5.0 32bit und 64 bit

I'm back from hell
Benutzeravatar
Proton
Beiträge: 152
Registriert: 20.06.2006 12:21
Wohnort: Eckernförde /Stadtbergen

Beitrag 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.
Zitat:
"Ich kann mich vor die Meute stellen und für Nichts kämpfen. Ich kann aber auch einen Schritt zur Seite gehen, die Meute vorbeiziehen lassen und dabei meine Zeit angenehm bei Freunden verbringen.". Da hat er Recht, mein Pap's.
Antworten