Exif-Headerlänge

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
roherter
Beiträge: 1407
Registriert: 10.04.2005 18:58
Kontaktdaten:

Exif-Headerlänge

Beitrag 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:
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 »

In der PureArea gibt es eine "ExifLib" zum download.
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
Frogger
Beiträge: 425
Registriert: 14.03.2006 19:27
Kontaktdaten:

Beitrag von Frogger »

Aber wenn du es selber auslesen willst, schau dir http://www.exif.org/specifications.html an.
[PB4.20]
Benutzeravatar
roherter
Beiträge: 1407
Registriert: 10.04.2005 18:58
Kontaktdaten:

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

I'm back from hell
Benutzeravatar
stbi
Beiträge: 685
Registriert: 31.08.2004 15:39
Wohnort: Cleverly Hills

Beitrag 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.
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
roherter
Beiträge: 1407
Registriert: 10.04.2005 18:58
Kontaktdaten:

Beitrag 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.
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 »

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:
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 »

Nach einem Marker "FF xx" folgen 2 Byte Segmentlänge (inkl.der 2 Byte
Segmentlänge)
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.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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()
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Proton
Beiträge: 152
Registriert: 20.06.2006 12:21
Wohnort: Eckernförde /Stadtbergen

Beitrag 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
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