
php小编柚子将为大家介绍如何在Go语言中使用GOTK3和librsvg加载内联SVG。GOTK3是一个用于创建跨平台GUI应用程序的Go语言绑定库,而librsvg是一个用于渲染SVG图像的库。通过结合使用这两个库,我们可以在Go语言中轻松地加载和显示内联SVG图像。接下来,让我们一起来看看具体的实现步骤吧!
我正在开发一个用 go 编写的应用程序。它使用 gotk3,安装了 librsvg,我可以使用 gtk.imagenewfromfile(file-path-to-svg) 创建(然后显示)svg 图像。
现在我想以编程方式从源代码中内联的 svg 创建图像......如下所示:
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) {
?
}...我需要一些关于 imagenewfromsvg() 的实现的帮助。 gotk3 没有 imagenewfromsvg() api,但它有 imagenewfrompixbuf()。
我尝试过从字符串(带有 svg 标记)创建 pixbuf,但我没能做到。
是否可以从源代码中定义的内联 svg 创建图像?如果是这样,imagenewfromsvg() 的实现是什么?
您可以使用 gdk.pixbufnewfromdataonly 加载内联 svg,方法是将 svg 字符串作为字节片段传递给它,然后从中获取 pixbuf 并将其放入 gtk.imagenewfrompixbuf 以获得 *gtk.image 以在窗口中使用它。
这是您提到的 imagenewfromsvg 函数的正确实现之一:
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
}实际gtk程序中的使用示例:
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
}以上就是如何使用 GOTK3 和 librsvg 在 Go 中加载内联 SVG?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号