Maison >développement back-end >Golang >Comment charger du SVG en ligne dans Go en utilisant GOTK3 et librsvg ?

Comment charger du SVG en ligne dans Go en utilisant GOTK3 et librsvg ?

PHPz
PHPzavant
2024-02-08 23:40:08891parcourir

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

l'éditeur php Youzi vous présentera comment utiliser GOTK3 et librsvg pour charger du SVG en ligne en langage Go. GOTK3 est une bibliothèque de liaison de langage Go permettant de créer des applications GUI multiplateformes, tandis que librsvg est une bibliothèque permettant de restituer des images SVG. En utilisant ces deux bibliothèques ensemble, nous pouvons facilement charger et afficher des images SVG en ligne en langage Go. Examinons ensuite les étapes spécifiques de mise en œuvre !

Contenu de la question

Je développe une application écrite en go. Il utilise gotk3, librsvg est installé et je peux créer (puis afficher) des images svg en utilisant gtk.imagenewfromfile(file-path-to-svg) .

Maintenant, je veux créer par programme une image à partir d'un svg en ligne dans le code source... comme ceci :

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) {
  ?
}

...J'ai besoin de quelque chose à propos de imagenewfromsvg() 的实现的帮助。 gotk3 没有 imagenewfromsvg() api,但它有 imagenewfrompixbuf().

J'ai essayé de créer un pixbuf à partir d'une chaîne (avec une balise svg) mais je n'ai pas pu le faire.

Est-il possible de créer une image à partir d'un svg en ligne défini dans le code source ? Si oui, quelle est l'implémentation de imagenewfromsvg() ? imagenewfromsvg() 的实现是什么?

解决方法

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

Vous pouvez utiliser gdk.pixbufnewfromdataonly pour charger un svg en ligne en lui passant la chaîne svg sous forme de fragment d'octet, puis en extraire le pixbuf et le mettre dans gtk.imagenewfrompixbuf pour obtenir *gtk.image pour l'utiliser dans la fenêtre.

Voici l'une des implémentations correctes de la fonction

que vous avez mentionnée : 

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
}

Exemple d'utilisation dans le programme gtk actuel :
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
}
Sortie :

🎜🎜🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer