Wie lade ich Inline-SVG in Go mit GOTK3 und librsvg?

PHPz
Freigeben: 2024-02-08 23:40:08
nach vorne
840 Leute haben es durchsucht

如何使用 GOTK3 和 librsvg 在 Go 中加载内联 SVG?

php-Editor Youzi zeigt Ihnen, wie Sie GOTK3 und librsvg zum Laden von Inline-SVG in der Go-Sprache verwenden. GOTK3 ist eine Go-Sprachbindungsbibliothek zum Erstellen plattformübergreifender GUI-Anwendungen, während librsvg eine Bibliothek zum Rendern von SVG-Bildern ist. Durch die gemeinsame Verwendung dieser beiden Bibliotheken können wir Inline-SVG-Bilder problemlos in der Go-Sprache laden und anzeigen. Schauen wir uns als Nächstes die konkreten Umsetzungsschritte an!

Frageninhalt

Ich entwickle eine in go geschriebene Anwendung. Es verwendet gotk3, librsvg ist installiert und ich kann SVG-Bilder mit gtk.imagenewfromfile(file-path-to-svg) erstellen (und dann anzeigen).

Jetzt möchte ich programmgesteuert ein Bild aus einer SVG-Datei inline im Quellcode erstellen ... so:

color := "#FF0000"
redSvg := 
  "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
  "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n" +
  "<svg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" width=\"32px\" height=\"32px\" viewBox=\"0 0 32 32\" enable-background=\"new 0 0 32 32\" xml:space=\"preserve\">\n" +
  "    <rect fill=\"" + color + "\" width=\"32\" height=\"32\"/>\n" +
  "</svg>"

image, err := ImageNewFromSvg(redSvg)
.
.
.


func ImageNewFromSvg(svg string) (*gtk.Image, error) {
  ?
}
Nach dem Login kopieren

...Ich brauche etwas über imagenewfromsvg() 的实现的帮助。 gotk3 没有 imagenewfromsvg() api,但它有 imagenewfrompixbuf().

Ich habe versucht, aus einem String (mit SVG-Tag) ein Pixbuf zu erstellen, aber es ist mir nicht gelungen.

Ist es möglich, ein Bild aus einer im Quellcode definierten Inline-SVG zu erstellen? Wenn ja, wie sieht die Implementierung von imagenewfromsvg() aus? imagenewfromsvg() 的实现是什么?

解决方法

您可以使用 gdk.pixbufnewfromdataonly 加载内联 svg,方法是将 svg 字符串作为字节片段传递给它,然后从中获取 pixbuf 并将其放入 gtk.imagenewfrompixbuf 以获得 *gtk.image< br/>Problemumgehungimagenewfromsvg

Sie können gdk.pixbufnewfromdataonly verwenden, um ein Inline-SVG zu laden, indem Sie ihm die SVG-Zeichenfolge als Bytefragment übergeben und dann den Pixbuf daraus abrufen und in gtk.imagenewfrompixbuf einfügen , um *gtk.image zu erhalten und es im Fenster zu verwenden.

Hier ist eine der korrekten Implementierungen der von Ihnen erwähnten

-Funktion:

func imagenewfromsvg(svg string) (*gtk.image, error){
  pixbuf, err := gdk.pixbufnewfromdataonly([]byte(svg))
  if err !=  nil {
    return nil, err
  }
  
  img, err := gtk.imagenewfrompixbuf(pixbuf)
  
  if err !=  nil {
    return nil, err
  }
  
  return img, nil
}
Nach dem Login kopieren

Verwendungsbeispiel im tatsächlichen GTK-Programm:
package main

import (
    "log"

    "github.com/gotk3/gotk3/gtk"
    "github.com/gotk3/gotk3/gdk"
)

func main() {
    gtk.Init(nil)

    win, err := gtk.WindowNew(gtk.WINDOW_TOPLEVEL)
    if err != nil {
        log.Fatal("Unable to create window:", err)
    }
    win.SetTitle("Svg Example")
    win.Connect("destroy", func() {
        gtk.MainQuit()
    })


    color := "#FF0000"
    svgdata := "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
               "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n" +
               "<svg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" width=\"32px\" height=\"32px\" viewBox=\"0 0 32 32\" enable-background=\"new 0 0 32 32\" xml:space=\"preserve\">\n" +
               "    <rect fill=\"" + color + "\" width=\"32\" height=\"32\"/>\n" +
               "</svg>"

    svgImage, err  := ImageNewFromSvg(svgdata)
    
    if err != nil {
        log.Fatal(err)
    }
    
    win.Add(svgImage)
    win.ShowAll()


    gtk.Main()
}  

func ImageNewFromSvg(svg string) (*gtk.Image, error){
  pixbuf, err := gdk.PixbufNewFromDataOnly([]byte(svg))
  if err !=  nil {
    return nil, err
  }
  
  img, err := gtk.ImageNewFromPixbuf(pixbuf)
  
  if err !=  nil {
    return nil, err
  }
  
  return img, nil
}
Nach dem Login kopieren
Ausgabe: 🎜🎜🎜

Das obige ist der detaillierte Inhalt vonWie lade ich Inline-SVG in Go mit GOTK3 und librsvg?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!