Hallo zusammen,
ich beschäftige mich gerade mit der GTK API und bin nun zwangsläufig bei dem Pixbuffer angekommen. Mit dem kann man nette Dinge machen um z. B. ein kleines schnelles Bildanzeige Programm zu basteln.
Jetzt aber die Frage, wenn ich Funktionen wie z. B. "gdk_pixbuf_scale_simple" nutze, bekomme ich als Ergebnis ein Pixbuffer Objekt. Wie kann ich das (ausser durch Startdrawing()-StopDrawing()) in ein internes Purebasic Image umwandeln ?
Jemand dazu noch eine Idee? Danke im Voraus.
Pixbuffer in PB Image konvertieren
- Makke
- Beiträge: 156
- Registriert: 24.08.2011 18:00
- Computerausstattung: AMD Ryzen 7 5700X - AMD Radeon RX 6800 XT - 32 GB DDR4 SDRAM
- Wohnort: Ruhrpott
- Kontaktdaten:
Pixbuffer in PB Image konvertieren
---
Windows 11 (64 bit)
Windows 11 (64 bit)
Re: Pixbuffer in PB Image konvertieren
Ich weiß jetzt nicht genau, wie sowas speicherintern aussieht. Speicherpuffer mit unkomprimierten RGB-Daten?
In der PB-Doku kann ich auch nicht wirklich herausfinden, welche API StartDrawing() unter Linux benutzt.
Vielleicht ist gdk_pixbuf_render_to_drawable() zu gebrauchen, wenn du den ImageOutput() eines leeren Bildes von gleicher Größe und Bittiefe dort übergibst?
Oder DrawImage(*pixBuffer)?
Vielleicht kannst du auch einen Bitmap-Header vor die Daten setzen und dann komplett mit CatchImage() importieren?
Um eine Konvertierung durch Ausrendern wirste nicht herumkommen, weil du externe Bilder nicht in die PB-interne Zählung integrieren kannst. Warum willst du das unbedingt in ein PB-Image verwandeln?
Vielleicht ist dir andersherum besser geholfen: Mit PB das Image erstellen (dann ist es nämlich in der PB-internen Zählung drin) und verwendest den Rückgabewert von ImageID() für deine API-Aufrufe. Wenn die fertig sind, hast du das Ergebnis ja auf deinem PB-Image.
In der PB-Doku kann ich auch nicht wirklich herausfinden, welche API StartDrawing() unter Linux benutzt.
Vielleicht ist gdk_pixbuf_render_to_drawable() zu gebrauchen, wenn du den ImageOutput() eines leeren Bildes von gleicher Größe und Bittiefe dort übergibst?
Oder DrawImage(*pixBuffer)?
Vielleicht kannst du auch einen Bitmap-Header vor die Daten setzen und dann komplett mit CatchImage() importieren?
Um eine Konvertierung durch Ausrendern wirste nicht herumkommen, weil du externe Bilder nicht in die PB-interne Zählung integrieren kannst. Warum willst du das unbedingt in ein PB-Image verwandeln?
Vielleicht ist dir andersherum besser geholfen: Mit PB das Image erstellen (dann ist es nämlich in der PB-internen Zählung drin) und verwendest den Rückgabewert von ImageID() für deine API-Aufrufe. Wenn die fertig sind, hast du das Ergebnis ja auf deinem PB-Image.
- Makke
- Beiträge: 156
- Registriert: 24.08.2011 18:00
- Computerausstattung: AMD Ryzen 7 5700X - AMD Radeon RX 6800 XT - 32 GB DDR4 SDRAM
- Wohnort: Ruhrpott
- Kontaktdaten:
Re: Pixbuffer in PB Image konvertieren
Hi, also mit den 2d Drawing Befehlen geht das:
Im Prinzip sollte jede PB Funktion, die die ImageID() erwartet, mit dem GDK Pixbuf funktionieren. Das scheint auch recht flott zu sein.
Mir ging es bspw. darum, dass man per SetGadgetState() einen PIXBUF übergeben kann, mit GetGadgetState() dann aber kein (verwertbares) PB Image erhält, sondern auch nur die ImageID, die dann wieder durch die oben genannte Procedure müsste.
Oder zB. CatchImage(), aber irgendwie funktioniert das auch nicht.
Trotzdem danke für Deine Tips.
Code: Alles auswählen
Procedure.i Pixbuf_ConvertToImage(Pixbuf.i)
Protected.i image, w, h, a
w = gdk_pixbuf_get_width(Pixbuf)
h = gdk_pixbuf_get_height(Pixbuf)
a = gdk_pixbuf_get_has_alpha(Pixbuf)
If a
image = CreateImage(#PB_Any, w, h, 32, #PB_Image_Transparent)
Else
image = CreateImage(#PB_Any, w, h, 24)
EndIf
If IsImage(image)
StartDrawing(ImageOutput(image))
If a
DrawingMode(#PB_2DDrawing_AllChannels)
Else
DrawingMode(#PB_2DDrawing_Default)
EndIf
DrawImage(Pixbuf, 0, 0, w, h)
StopDrawing()
Else
ProcedureReturn -1
EndIf
ProcedureReturn image
EndProcedure
Mir ging es bspw. darum, dass man per SetGadgetState() einen PIXBUF übergeben kann, mit GetGadgetState() dann aber kein (verwertbares) PB Image erhält, sondern auch nur die ImageID, die dann wieder durch die oben genannte Procedure müsste.
Oder zB. CatchImage(), aber irgendwie funktioniert das auch nicht.
Trotzdem danke für Deine Tips.
---
Windows 11 (64 bit)
Windows 11 (64 bit)
Re: Pixbuffer in PB Image konvertieren
Sowas ähnliches dachte ich mir schon.
Wo ist das Problem genau?
Dein Pixbuf_ConvertToImage() macht doch genau das, was du möchtest.
CatchImage() ist dazu da, eine in RAM geladene Bilddatei (bmp,png oder jpeg) "aufzuschnappen" und als Image zu laden. Also wie LoadImage(), nur eben vom RAM und nicht von der Festplatte. Statt dem Dateinamen wird der entsprechende Zeiger auf die Bilddatei übergeben.
PS: Schau dir mal CanvasGadget() an. So, wie sich dein Vorhaben liest (Bild wird in ein Gadget gesetzt -> muss aktualisiert werden -> GedGadgetState() -> Pixbuff_ConvertToImage() -> SetGadgetState(ImageId()) -> und immer wieder von vorne?), ist das evtl. die bessere Option, weil es genau dafür gedacht ist.
Wo ist das Problem genau?
Dein Pixbuf_ConvertToImage() macht doch genau das, was du möchtest.
CatchImage() ist dazu da, eine in RAM geladene Bilddatei (bmp,png oder jpeg) "aufzuschnappen" und als Image zu laden. Also wie LoadImage(), nur eben vom RAM und nicht von der Festplatte. Statt dem Dateinamen wird der entsprechende Zeiger auf die Bilddatei übergeben.
PS: Schau dir mal CanvasGadget() an. So, wie sich dein Vorhaben liest (Bild wird in ein Gadget gesetzt -> muss aktualisiert werden -> GedGadgetState() -> Pixbuff_ConvertToImage() -> SetGadgetState(ImageId()) -> und immer wieder von vorne?), ist das evtl. die bessere Option, weil es genau dafür gedacht ist.
- Makke
- Beiträge: 156
- Registriert: 24.08.2011 18:00
- Computerausstattung: AMD Ryzen 7 5700X - AMD Radeon RX 6800 XT - 32 GB DDR4 SDRAM
- Wohnort: Ruhrpott
- Kontaktdaten:
Re: Pixbuffer in PB Image konvertieren
Probleme ? Die gibt's hier nicht, nur Lösungen.DarkSoul hat geschrieben:Sowas ähnliches dachte ich mir schon.
Wo ist das Problem genau?
Dein Pixbuf_ConvertToImage() macht doch genau das, was du möchtest.
CatchImage() ist dazu da, eine in RAM geladene Bilddatei (bmp,png oder jpeg) "aufzuschnappen" und als Image zu laden. Also wie LoadImage(), nur eben vom RAM und nicht von der Festplatte. Statt dem Dateinamen wird der entsprechende Zeiger auf die Bilddatei übergeben.
PS: Schau dir mal CanvasGadget() an. So, wie sich dein Vorhaben liest (Bild wird in ein Gadget gesetzt -> muss aktualisiert werden -> GedGadgetState() -> Pixbuff_ConvertToImage() -> SetGadgetState(ImageId()) -> und immer wieder von vorne?), ist das evtl. die bessere Option, weil es genau dafür gedacht ist.
Zuerst dachte ich, dass diese DrawImage Sache langsam ist, ist sie aber nicht, von daher Problem gelöst. Ich dachte halt (da man an die Pixeldaten vom Pixbuf kommt) wäre ein Konvertierung im Speicher vielleicht schneller. Aber ich bin jetzt ganz auf die Pixbuf Funktionen umgeschwenkt und brauche PB "nur noch" für die Fensterverwaltung (wobei ich sagen muss, das die Sprache dafür sehr gut, weil sehr einfach, geeignet ist).
Ich arbeite also mit dem ImageGadget, an das ich beliebig das Pixbuf Handle übergeben kann.
Aber wenn noch wer einen Tip hat immer her damit, dafür sind solche Fundgruben ja da.
---
Windows 11 (64 bit)
Windows 11 (64 bit)