Free_Image Metadaten schreiben

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
scoty
Beiträge: 64
Registriert: 18.10.2005 16:43
Wohnort: Raum Hildesheim

Free_Image Metadaten schreiben

Beitrag von scoty »

Hallo Forum,
ich habe ein Programm, dass mit Hilfe der Free_Image.dll metainformationen aus einem Bild lesen kann. Soweit funktioniert es.

Jetzt habe ich den Wunsch diese Daten auch zu manipulieren.
Aktuell interessieren mich lediglich die Keywords aus dem Bereich IPTC.

Im angehangenen Code habe ich eine Procedure, der ich Dateinamen und Keyword übergebe.
Nach der PDF-Anleitung habe ich dann die Datei geöffnet, abgefragt ob sie schreibbar ist, meine Daten angelegt und geschrieben.
Bis dahin geht's, nur das Speichern ins Bild funktioniert noch nicht.
Ich habe mitlerweile versucht unter anderem Dateinamen als die geöffnete Datei zu speichern, auch hier kein Erfolg.

Ich hoffe es kann mir jemand meinen Fehler zeigen.

Gruß Scoty

Code: Alles auswählen

Procedure write_IPTC_keyword(imgpath.s, keyword.s) 
  
  fif = CallFunction(0, "_FreeImage_GetFileType@8", @imgpath, 0)                ; Dateityp aus Datei lesen
  If fif = #FIF_UNKNOWN
    fif = CallFunction(0, "_FreeImage_GetFIFFromFilename@4", @imgpath)          ; Bei Fehlschlag Dateityp aus Daiteinamen ermitteln
    If fif = #FIF_UNKNOWN:ProcedureReturn 1:EndIf
  EndIf
  
  If CallFunction(0, "_FreeImage_FIFSupportsWriting@4", fif):Else:ProcedureReturn 2:EndIf
  dib = CallFunction(0, "_FreeImage_Load@12", fif, @imgpath, 0)
  If dib : Else : ProcedureReturn 3:EndIf
  
  *tag = CallFunction(0, "_FreeImage_CreateTag@0")
  If *tag : Else : ProcedureReturn 4:EndIf
  
  ; TagDaten schreiben
  key.s = "Keywords"
  Debug CallFunction(0, "_FreeImage_SetTagKey@8",    *tag, @key)
  Debug CallFunction(0, "_FreeImage_SetTagLength@8", *tag, Len(keyword))
  Debug CallFunction(0, "_FreeImage_SetTagCount@8",  *tag, Len(keyword))
  Debug CallFunction(0, "_FreeImage_SetTagType@8",   *tag, #FIDT_ASCII)
  ; the tag value must be stored after
  ; the tag Data type, tag count And tag length have been filled.
  Debug CallFunction(0, "_FreeImage_SetTagValue@8", *tag, @keyword)
  ; store the tag
  Debug CallFunction(0, "_FreeImage_SetMetadata@16", #FIMD_IPTC, dib, @key, *tag);
  ; destroy the tag
  Debug CallFunction(0, "_FreeImage_DeleteTag@4", *tag)
  
  save.s = "c:\BildNeu.JPG"
  Debug CallFunction(0, "_FreeImage_Save@16", fif, *dib, @save , 0)
  
EndProcedure
Die Debugausgabe:

Code: Alles auswählen

1
1
1
1
1
1
1
0
0
Die letzte "0" ist der Rückgabewert meiner eigenen Procedure.
- chris -
Beiträge: 195
Registriert: 24.08.2005 19:52
Wohnort: Stadtallendorf

Re: Free_Image Metadaten schreiben

Beitrag von - chris - »

Hab das ganze mal mit Prototypen und EnableExplicit umgeschrieben:

Code: Alles auswählen


EnableExplicit

Define imgpath.s, keyword.s

IncludeFile "FreeImage.pbi"

Procedure write_IPTC_keyword(imgpath.s, keyword.s)

  Protected fif.i, dib.i, *tag.i, key.s, save.s

  fif = FreeImage_GetFileType(imgpath, 0)

  Debug fif

  If fif = #FIF_UNKNOWN
    fif = FreeImage_GetFIFFromFilename(imgpath)
    If fif = #FIF_UNKNOWN
      ProcedureReturn 1
    EndIf
  EndIf

  If FreeImage_FIFSupportsWriting(fif)
    Debug "FreeImage_FIFSupportsWriting"
  Else
    ProcedureReturn 2
  EndIf

  dib = FreeImage_Load(fif, imgpath, 0)

  If dib
    Debug "FreeImage_Load: " + Str(dib)
  Else
    ProcedureReturn 3
  EndIf

  *tag = FreeImage_CreateTag()

  If *tag
    Debug "FreeImage_CreateTag: " + Str(*tag)
  Else
    ProcedureReturn 4
  EndIf

  ; TagDaten schreiben
  key = "Keywords"
  Debug FreeImage_SetTagKey(*tag, key)
  Debug FreeImage_SetTagLength(*tag, Len(keyword))
  Debug FreeImage_SetTagCount(*tag, Len(keyword))
  Debug FreeImage_SetTagType(*tag, #FIDT_ASCII)
  ; the tag value must be stored after
  ; the tag Data type, tag count And tag length have been filled.
  Debug FreeImage_SetTagValue(*tag, keyword)
  ; store the tag
  Debug FreeImage_SetMetadata(#FIMD_IPTC, dib, key, *tag)
  ; destroy the tag
  Debug FreeImage_DeleteTag(*tag)
  
  save = "bildneu.jpg"
  Debug FreeImage_Save(fif, dib, save , 0)
  
EndProcedure

If FreeImage_OpenDLL()

  Debug "FreeImage_OpenDLL"

  imgpath = "bild.jpg"
  keyword = "123"

  write_IPTC_keyword(imgpath, keyword)

  FreeImage_CloseDLL()

EndIf

Code: Alles auswählen

FreeImage_OpenDLL
2
FreeImage_FIFSupportsWriting
FreeImage_Load: 31068712
FreeImage_CreateTag: 31129496
1
1
1
1
1
1
1
1

Bei dir steht beim letzten dib ein Sternchen davor:

Code: Alles auswählen


Debug CallFunction(0, "_FreeImage_Save@16", fif, *dib, @save , 0)

__________________________________________________
Quote-Tags durch Code-Tags ersetzt
06.11.2011
RSBasic
PB v5.72 x86/x64
Windows 10 Pro 64bit
scoty
Beiträge: 64
Registriert: 18.10.2005 16:43
Wohnort: Raum Hildesheim

Re: Free_Image Metadaten schreiben

Beitrag von scoty »

Hallo,
ich bin erst gerade zum Lesen der Antwort gekommen.

Super! Dankeschön! :allright:
Ich dachte mir irgendwie, dass es soetwas ist, ich hab's nur einfach nicht gesehen. Jetzt geht's :D

Die Sache mit den Prototypen sehe ich mir auch nochmal an.

Aber scheibar kann man nicht direkt in die Datei speichern, die man zuvor geöffnet hat. Muss mir die Funktionen SaveToHandle und SaveToMemory nochmal ansehen.

Gruß Scoty
Antworten