Pixbuffer in PB Image konvertieren

In dieser Linux-Ecke dürfen nur Themen rund um Linux geschrieben werden.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
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

Beitrag von Makke »

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.
---
Windows 11 (64 bit)
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Re: Pixbuffer in PB Image konvertieren

Beitrag von DarkSoul »

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? :D

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? :D

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.
Bild
Benutzeravatar
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

Beitrag von Makke »

Hi, also mit den 2d Drawing Befehlen geht das:

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
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.
---
Windows 11 (64 bit)
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Re: Pixbuffer in PB Image konvertieren

Beitrag von DarkSoul »

Sowas ähnliches dachte ich mir schon.

Wo ist das Problem genau?

Dein Pixbuf_ConvertToImage() macht doch genau das, was du möchtest. :allright:

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.
Bild
Benutzeravatar
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

Beitrag von Makke »

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. :allright:

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.
Probleme ? Die gibt's hier nicht, nur Lösungen. ;-)

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)
Antworten