Bildinformationen (Kommentar, ...) auslesen/schreiben?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Programie
Beiträge: 1280
Registriert: 06.08.2005 22:56
Computerausstattung: https://www.sysprofile.de/id160800
Wohnort: Gernsbach
Kontaktdaten:

Bildinformationen (Kommentar, ...) auslesen/schreiben?

Beitrag von Programie »

Hi,

Wie kann man mit PureBasic Informationen über ein Bild aus der Datei des Bildes auslesen?
Also Informationen wie Kommentar oder Titel.
Und wie kann man diese Daten ändern?

Es soll mit den Formaten BMP, JPG und PNG funktionieren.

Weiß jemand, wie das geht?
BildBildBildBild
Benutzeravatar
Thomas
Beiträge: 893
Registriert: 06.07.2006 19:24
Wohnort: Regensburg
Kontaktdaten:

Beitrag von Thomas »

Das habe ich auch schon mal gefragt ...

Such mal nach Exif ...
Da gabs auch mal ne User-Lib, aber ich glaube die ging bei PB 4.xx nicht mehr :-(.
v6.00
Benutzeravatar
Programie
Beiträge: 1280
Registriert: 06.08.2005 22:56
Computerausstattung: https://www.sysprofile.de/id160800
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von Programie »

Thomas hat geschrieben:Das habe ich auch schon mal gefragt ...

Such mal nach Exif ...
Da gabs auch mal ne User-Lib, aber ich glaube die ging bei PB 4.xx nicht mehr :-(.
Hmm, EXIF. Das ist doch das total komplizierte Zeug, oder? :lol:

Wegen der UserLib: Kann man die benötigten Befehle nicht einfach mit einer von der UserLib unterstützten PB-Version in ne DLL packen und dann mit PB4 die Funktionen aus der DLL aufrufen?
BildBildBildBild
Benutzeravatar
[chaos]
Beiträge: 9
Registriert: 04.08.2006 14:40
Wohnort: Ludwigshafen
Kontaktdaten:

Beitrag von [chaos] »

Exif ist das Dateiformat indem diese Informationen gespeichert werden.

Mit GDI+ lassen sich diese Informationen auslesen.
Einfach mal hier nachschauen.

Oder über den FreeImage Wrapper.
Benutzeravatar
Programie
Beiträge: 1280
Registriert: 06.08.2005 22:56
Computerausstattung: https://www.sysprofile.de/id160800
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von Programie »

[chaos] hat geschrieben:Exif ist das Dateiformat indem diese Informationen gespeichert werden.

Mit GDI+ lassen sich diese Informationen auslesen.
Einfach mal hier nachschauen.

Oder über den FreeImage Wrapper.
Und das ist nicht zu kompliziert? :mrgreen:
Da steht ja auch, dass GDI+ nur in Windows XP integriert ist. Geht es dann auch mit Vista? Oder ist es wirklich nur für XP?
Ich denke mal, dass es ab XP ist, oder? :?

Mir ist gerade was aufgefallen: Die Zip-Datei mit den Quellcodes kann man irgendwie nicht downloaden. :(
Und das mit FreeImage bekomme ich auch nicht zum Laufen. :roll:
BildBildBildBild
Benutzeravatar
[chaos]
Beiträge: 9
Registriert: 04.08.2006 14:40
Wohnort: Ludwigshafen
Kontaktdaten:

Beitrag von [chaos] »

Ich hab mal schnell nen Beispielcode erstellt

Code: Alles auswählen

#LIB_FREEIMAGE = 1

IncludeFile "freeimage_functions.pb"
IncludeFile "freeimage_struct.pb"

Procedure GetEXIF(Model.b)
  Shared dib
  
  mdhandle = FreeImage_FindFirstMetadata(Model, dib, @tag)

  If mdhandle
    Repeat
      tagDesc$ = PeekS(FreeImage_GetTagKey(tag))
      tagType = FreeImage_GetTagType(tag)
      FreeImage_GetMetadata(Model, dib, tagDesc$, @tagData)
      tagData = FreeImage_GetTagValue(tagData)
    
      If tagType = 1 ; 8-bit unsigned byte
        Debug tagDesc$+" >> "+Str(PeekB(tagData) & $FF)
      ElseIf tagType = 2 ; ASCII-String
        Debug tagDesc$+" >> "+PeekS(tagData)
      ElseIf tagType = 3 ; 16-bit unsigned word
        Debug tagDesc$+" >> "+Str(PeekW(tagData) & $FFFF)
      ElseIf tagType = 4 ; 32-bit unsigned long
        Debug tagDesc$+" >> "+Str(PeekL(tagData) & $FFFFFFFF)
      ElseIf tagType = 5 ; 64-bit unsigned quad
        Debug tagDesc$+" >> "+Str(PeekQ(tagData) & $FFFFFFFFFFFFFFFF)
      ElseIf tagType = 6 ; 8-bit signed byte
        Debug tagDesc$+" >> "+Str(PeekB(tagData))
      ElseIf tagType = 7 ; 8-bit untyped data
        Debug tagDesc$+" >> "+Str(PeekB(tagData))
      ElseIf tagType = 8 ; 16-bit signed word
        Debug tagDesc$+" >> "+Str(PeekW(tagData))
      ElseIf tagType = 9 ; 32-bit signed long
        Debug tagDesc$+" >> "+Str(PeekL(tagData))
      ElseIf tagType = 10 ; 64-bit signed quad
        Debug tagDesc$+" >> "+Str(PeekQ(tagData))
      ElseIf tagType = 11 ; 32-bit float
        Debug tagDesc$+" >> "+Str(PeekF(tagData))
      ElseIf tagType = 12 ; 64-bit double
        Debug tagDesc$+" >> "+Str(PeekD(tagData))
;       ElseIf tagType = 13 ; 32-bit unsigned long as offset
;         Debug tagDesc$+" >> "+Str(PeekL(tagData) & $FFFFFFFF)
;       ElseIf tagType = 13 ; 32-bit as RGBQUAD - *Result.RGBQUAD
;         Debug tagDesc$+" >> "+Str(PeekL(tagData) & $FFFFFFFF)
      EndIf
    
      sid = FreeImage_FindNextMetadata(mdhandle, @tag)
    Until sid = #Null
  
    FreeImage_FindCloseMetadata(mdhandle)
  Else
    Debug "No metadata found!"
  EndIf
EndProcedure

OpenLibrary(#LIB_FREEIMAGE, "freeimage.dll")

File$ = OpenFileRequester("Select file with EXIF information", "", "*.*", 0)

If Not File$
  End
EndIf

fif = FreeImage_GetFileType(File$, 0)

If fif = #FIF_UNKNOWN
  Debug "Unknown signature! Guessing filetype!"
  
  fif = FreeImage_GetFIFFromFilename(File$)
EndIf

If fif <> #FIF_UNKNOWN And FreeImage_FIFSupportsReading(fif)
  dib = FreeImage_Load(fif, File$, #Null)

  GetEXIF(#FIMD_EXIF_MAIN)
  GetEXIF(#FIMD_EXIF_EXIF)
  
  FreeImage_Unload(dib)
EndIf
Etwas umständlich dieser Weg aber er funktioniert bei mir einwandfrei.
Die einzelnen Datentypen und deren Interpretation stehen in der Dokumentation.
Antworten