Seite 1 von 2

Kann man Bilder aus Imagegadget in Webviewgadget oder Webgadget darstellen?

Verfasst: 13.02.2026 10:40
von EmmJott
Guude!

Ich schreibe für mein kleines Prog eine Hilfeseite, die in einem Unterfenster als Webgadget (oder Webviewgadget) und "interner" html-Datei (wie in der Webviewgadget-Hilfe im Beispiel "Beispiel: mit Inline-HTML-Code") gezeigt werden soll. So weit so gut, das funzt.

Jetzt hatte ich die Idee, die Bilder, die bereits im Programm enthalten sind (in Imagegadgets bzw. als IncludeBinary in DataSection) mittels "<img>"-Tag einbinden kann. Kann mich da jemand unterstützen?

Edit:
Hier (viewtopic.php?p=359123#p359123) hat Stargate eine Lösung für ein ähnliches Problem gezeigt. Ich habe nur gar keine Ahnung, wie das für mich umzusetzen ist. Die vage Vorstellung ist

Code: Alles auswählen

DataSection
  bild:
  IncludeBinary "C:\Users\user\Documents\Purebasic\abc.png"
  endof_bild:  
EndDataSection
mit ?bild und ?endof_bild Anfang und Ende des Speicherbereichs ermitteln, mit Base64Encoder einen base64string erzeugen und im Webgadget
das Bild mit <img src="data:image/png;base64," + base64-string> anzeigen.

Wenn das überhaupt geht - ich habe keine Ahnung, wie das mit Buffer und Speicherzugriff und Zeigern gemacht wird ...

2. Nachtrag: Damit niemand auf eine falsche Fährte gelockt wird. Es geht nicht um Fotos o.ä., sondern um Grafiken (meist PNG mit transparenten Anteilen), wie sie beispielsweise für Imagebuttons etc. verwendet werden, also relativ kleinformatig. Sinn der Sache ist, in einer Hilfe-Seite Funktionen der Buttons zu erläutern (weil ein Bild halt mehr als tausend Worte sagt) oder die Hilfeseite grafisch aufzupeppen (Pfeile, Striche, ...)

Re: Kann man Bilder aus Imagegadget in Webviewgadget oder Webgadget darstellen?

Verfasst: 13.02.2026 20:33
von Delle
Wieso speicherst du das Bild nicht einfach lokal auf der Platte (Temp-Ordner) und lädst es dann mit dem HTML-IMG-Tag ein?

Re: Kann man Bilder aus Imagegadget in Webviewgadget oder Webgadget darstellen?

Verfasst: 13.02.2026 21:13
von EmmJott
Hi,

ja, könnte ich machen, aber höchst ungern. Fühlt sich auch nicht richtig an, Daten erst in den Temp-Ordner zu exportieren, um die dann wieder importieren zu können. Erinnert ein wenig an Phil Collins ("you gotta get in to get out")

Re: Kann man Bilder aus Imagegadget in Webviewgadget oder Webgadget darstellen?

Verfasst: 13.02.2026 21:19
von Delle
Naja umdreht kann man es auch so auslegen: es fühlt sich nicht richtig an, wenn Fotos innerhalb der Exe mitkommen und dann außerhalb der Exe verwendet werden sollen ;)

Re: Kann man Bilder aus Imagegadget in Webviewgadget oder Webgadget darstellen?

Verfasst: 13.02.2026 21:22
von Delle
Eine Idee wäre noch die Fotos in einer DB mittels SetDatabaseBlob() zu speichern und auch zu inkludieren.

Das lässt sich vermutlich dann einfach auslesen und ausgeben...

Re: Kann man Bilder aus Imagegadget in Webviewgadget oder Webgadget darstellen?

Verfasst: 13.02.2026 23:02
von jogo
ich weiß jetzt nicht, ob du mit html auch auf Images im speicher zugreifen kannst.
Ich hab dich aber jetzt so verstanden, dass du erstmal ein mitcompiliertes Bild im Programm verfügbar machen möchtest?

Code: Alles auswählen

OpenWindow(0, 100, 50, 380, 255, "Ein Fenster", #PB_Window_MinimizeGadget)
UsePNGImageDecoder()                            ;zum laden des icons für die taskleiste
; .... andere Sachen

CatchImage(3, ?logo)                          ;logo in den speicher laden // ist dann als Image #3 und wenn nötig mit ImageID(3) überall einsetzbar
gtk_window_set_icon_(WindowID(0), ImageID(3)) ;minibild für das taskleistensymbol zuweisen // ist ein gtk-api befehl aus dem forum // 128x128 funktioniert

;oder auch irgendwo in ein Imagegadget anzeigen:
ImageGadget(50,  5, 0, 31, 40, ImageID(3))                     ; Imagegadget für logo

; .... Ereignisschleife etc.

;ganz unten:
DataSection
  logo:
  IncludeBinary "/Pfad/zum/bild.png" ;logo für taskleiste (von super-icon)
EndDataSection

End 
Jetzt müßtest du also nur nur schauen, ob du mit dem Image im Webvievgadget was anfangen kannst.
Oder ich hab dich einfach nur falsch interpretiert ;-)

Re: Kann man Bilder aus Imagegadget in Webviewgadget oder Webgadget darstellen?

Verfasst: 14.02.2026 02:07
von jogo
ja - ok, ich hatte das Problem tatsächlich nicht verstanden :roll:
hab mir grad mal das Thema zum WebView angeschaut - da ist mein Beitrag natürlich keine Hilfe. Bis dahin hast das mit Garantie schon selbst umgesetzt. ;-)

Re: Kann man Bilder aus Imagegadget in Webviewgadget oder Webgadget darstellen?

Verfasst: 14.02.2026 13:50
von Delle
Noch eine Idee: die Bilder zusätzlich als Base64-Strings mit im Code speichern.

Re: Kann man Bilder aus Imagegadget in Webviewgadget oder Webgadget darstellen?

Verfasst: 14.02.2026 15:12
von EmmJott
Also - die Bilder sind ja schon da! Nicht nur im Programm in der Datasection, sondern größtenteils bereits im Speicher (als Imagegadgets, Buttonimagegadgets, ...). Und jetzt nochmal als Base64-Strings in das Programm packen?

Re: Kann man Bilder aus Imagegadget in Webviewgadget oder Webgadget darstellen?

Verfasst: 15.02.2026 01:27
von jogo
um Base64-Strings kommst ja nicht herum. Wenn man die genaue Größe der in Datasection enhaltenen IncludeBinary zur Laufzeit hätte, würdest du ja daraus diese Base64-Strings für dein WebView bauen können.
Habe nix PB-internes gefunden (MemorySize ist für diesen Zweck wohl ungeeignet), die exakte Größe dieser IncludeBinary zu ermitteln, um damit mit BildString = Base64Encoder(*EingabePuffer, EingabeGröße) deinen Base64-String zu bauen.
Aber wie du es auch wendest - du hast dadurch dein Bild immer 3x im Speicher (1x in der exe, 1x im Image, 1x im Base64-String). Bei kleinen Bildchen wohl nicht weiter schlimm...

Um die richtige Größe zu ermitteln könnte folgenes funktionieren (hab ich vor vielen Jahren mal mit vielen sound & textdateien gemacht
Gegeben:

Code: Alles auswählen

;-datensection
DataSection          
  bild0:
  IncludeBinary "data/pic0.png"   
  bild1:
  IncludeBinary "data/pic1.png"   
  dx:
  IncludeBinary "data/x.txt"       ;leere 0 byte dummi-datei, um auf diese weise das ende des letzten bildes zu errechnen
EndDataSection

;und dann:
*ad0 = ?bild0           ; start-speicheradresse für bild0i in *ad1
*ad1 = ?bild1           ; start-speicheradresse für bild0i in *ad2
*ad2 = ?dx              ; start-speicheradresse für dummy  in *ad3

;Länge der Bilder errechnen 
laenge_bild0 = *ad1 - *ad0    ;möglicherweise nochmal minus 2 Bytes - probieren...
laenge_bild1 = *ad2 - *ad1
Genaugenommen sollte dieser errechnete Wert exakt der Größe des Bildes entsprechen, welches du beim Compilieren in IncludeBinary importierst.
Jo - und dann:

Code: Alles auswählen

bild_0 = Base64Encoder(?bild0, laenge_bild0) 
Wie das dann mit dem WebView weitergeht, weiß ich leider nicht (noch nie gemacht)
Aber du hättest auf diese Weise einen (hoffentlich) funktionierenden Base64-String