Hallo,
danke für die Antworten, zunächst, es funktioniert jetzt wie es soll, ich weiß nicht ob es an der 5.43LTS lag, aber der gleiche Code mit der 5.44LTS funktioniert jetzt:
Code: Alles auswählen
EnableExplicit
ImportC ""
g_error_free (*error.GError)
gdk_pixbuf_get_width (*pixbuf)
gdk_pixbuf_get_height (*pixbuf)
gdk_pixbuf_new_from_file (filename.p-utf8, *error.GError)
gdk_pixbuf_new_from_file_at_scale (filename.p-utf8, width.i, height.i, preserve_aspect_ratio.b, *error.GError)
gdk_pixbuf_save (*pixbuf, filename.p-utf8, type.p-utf8, *error.GError) As "gdk_pixbuf_save"
gdk_pixbuf_save1 (*pixbuf, filename.p-utf8, type.p-utf8, *error.GError, key1.p-utf8, val1.p-utf8, terminate.b = #Null) As "gdk_pixbuf_save"
gdk_pixbuf_save2 (*pixbuf, filename.p-utf8, type.p-utf8, *error.GError, key1.p-utf8, val1.p-utf8, key2.p-utf8, val2.p-utf8, terminate.b = #Null) As "gdk_pixbuf_save"
gdk_pixbuf_savev (*pixbuf, filename.p-utf8, type.p-utf8, *option_keys, *option_values, *error.GError)
EndImport
Define.i newpix
Define.GError *error
Dim keys.s(3)
Dim values.s(3)
Macro toUTF8(Text, Var)
Var = Space(Len(Text))+1
PokeS(@Var, Text, Len(Text), #PB_UTF8)
EndMacro
;keys(0) = "quality"
toUTF8("quality", keys(0))
;values(0) = "50"
toUTF8("50", values(0))
If OpenWindow(0, 0, 0, 800, 600, "PIXBUF Test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
If ImageGadget(0, 0, 0, WindowWidth(0), WindowHeight(0), 0)
newpix = gdk_pixbuf_new_from_file_at_scale (#PB_Compiler_Home + "examples/sources/Data/PureBasic.bmp", GadgetWidth(0), GadgetHeight(0), #True, @*error)
If newpix = 0 Or *error <> 0
Debug *error\domain
Debug *error\code
Debug PeekS(*error\message, -1, #PB_Ascii)
g_error_free(*error)
Else
SetGadgetState(0, newpix)
Debug "ImageSize: " + Str(gdk_pixbuf_get_width(newpix)) + "x" + Str(gdk_pixbuf_get_height(newpix))
;gdk_pixbuf_save1(newpix, "PureBasic.jpg", "jpeg", @*error, "quality", "50")
gdk_pixbuf_savev(newpix, "PureBasic.jpg", "jpeg", keys(), values(), @*error)
EndIf
EndIf
EndIf
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
End
Soweit so gut.
Nun zu den Antworten, Bisonte meint, dass die Strings im Speicher (umgewandelt) bleiben und ich in dem Array nur die Adressen speichere und übergebe (also als Integer Array). Omi will jedoch ein String Array aufbauen und das dann übergeben. Ersteres habe ich nicht probiert, die zweite Variante hat bisher immer gut funktioniert, außer bei dieser Funktion (möglicherweise hatte das mit einem Bug in 5.43 zu tun).
Was mich an der ganzen Sache noch wundert, wenn ich einer Prozedure/Funktion ein Array mit dem Schlüsselwort "Array" übergebe, passiert die gemäß Anleitung als Referenz. Trotzdem ändert PureBasic die Formatierung der Strings, finde ich irgendwie merkwürdig.
Das ändert aber an der Grundproblematik nichts, das Pseudotypen nicht mit (String-)Arrays zusammen arbeiten und das man Pseudotypes keine Defaultwerte übergeben kann:
Code: Alles auswählen
gdk_pixbuf_save (*pixbuf, filename.p-utf8, type.p-utf8, *error.GError = #Null) ;<-- geht
gdk_pixbuf_save (*pixbuf, filename.p-utf8, type.p-utf8 = "jpeg", *error.GError = #Null) ;<-- SyntaxError
Dann wird ein Syntax-Fehler ausgegeben. Vielleicht sollte das auf die ToDo Liste.