Bagaimana untuk memuatkan SVG sebaris dalam Go menggunakan GOTK3 dan librsvg?

PHPz
Lepaskan: 2024-02-08 23:40:08
ke hadapan
840 orang telah melayarinya

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

editor php Youzi akan memperkenalkan kepada anda cara menggunakan GOTK3 dan librsvg untuk memuatkan SVG sebaris dalam bahasa Go. GOTK3 ialah perpustakaan pengikat bahasa Go untuk mencipta aplikasi GUI merentas platform, manakala librsvg ialah perpustakaan untuk memaparkan imej SVG. Dengan menggunakan kedua-dua perpustakaan ini bersama-sama, kami boleh memuatkan dan memaparkan imej SVG sebaris dalam bahasa Go dengan mudah. Seterusnya, mari kita lihat langkah pelaksanaan khusus!

Kandungan soalan

Saya sedang membangunkan aplikasi yang ditulis dalam go. Ia menggunakan gotk3, librsvg dipasang dan saya boleh mencipta (dan kemudian memaparkan) imej svg menggunakan gtk.imagenewfromfile(file-path-to-svg) .

Sekarang saya mahu mencipta imej secara pemrograman daripada svg sebaris dalam kod sumber... seperti ini:

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) {
  ?
}
Salin selepas log masuk

...saya perlukan sesuatu tentang imagenewfromsvg() 的实现的帮助。 gotk3 没有 imagenewfromsvg() api,但它有 imagenewfrompixbuf().

Saya cuba mencipta pixbuf daripada rentetan (dengan tag svg) tetapi saya tidak dapat melakukannya.

Adakah mungkin untuk mencipta imej daripada svg sebaris yang ditakrifkan dalam kod sumber? Jika ya, apakah pelaksanaan imagenewfromsvg()? imagenewfromsvg() 的实现是什么?

解决方法

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

Anda boleh menggunakan gdk.pixbufnewfromdataonly untuk memuatkan svg sebaris dengan menghantar rentetan svg sebagai serpihan bait dan kemudian dapatkan pixbuf daripadanya dan masukkan ke dalam gtk.imagenewfrompi untuk mendapatkan *gtk.image untuk menggunakannya dalam tetingkap.

Berikut ialah salah satu pelaksanaan yang betul bagi fungsi

yang anda nyatakan:

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
}
Salin selepas log masuk

Contoh penggunaan dalam program gtk sebenar:
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
}
Salin selepas log masuk
Keluaran: 🎜🎜🎜

Atas ialah kandungan terperinci Bagaimana untuk memuatkan SVG sebaris dalam Go menggunakan GOTK3 dan librsvg?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!