Maison > développement back-end > Golang > le corps du texte

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

PHPz
Libérer: 2024-02-08 23:40:08
avant
840 Les gens l'ont consulté

如何使用 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) {
  ?
}
Copier après la connexion

...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.image< br/>Solution 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
}
Copier après la connexion

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
}
Copier après la connexion
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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!