Heim >Backend-Entwicklung >Golang >Wie lade ich Inline-SVG in Go mit GOTK3 und librsvg?

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

PHPz
PHPznach vorne
2024-02-08 23:40:08898Durchsuche

如何使用 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) {
  ?
}

...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.imageProblemumgehungimagenewfromsvg

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
}

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
}
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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen