Seite 1 von 1

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

Verfasst: 13.07.2008 23:03
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?

Verfasst: 14.07.2008 20:59
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 :-(.

Verfasst: 14.07.2008 21:02
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?

Verfasst: 15.07.2008 19:14
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.

Verfasst: 30.07.2008 18:30
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:

Verfasst: 01.08.2008 20:47
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.