我在做一个用围棋写的应用程序.它使用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().

我曾try 实现从字符串(使用SVG标记)创建一个Pixbuf,但我还没能做到.

可以从源代码中定义的内联SVG创建图像吗?如果是这样的话,ImageNewFromSvg()的实施会是什么?

推荐答案

You can load inlined SVG with gdk.PixbufNewFromDataOnly through passing your svg string as slice of bytes to it then getting pixbuf from it and putting it to gtk.ImageNewFromPixbuf to get *gtk.Image to use it in your window.
And here is one of correct implementation of your mentioned ImageNewFromSvg function:

func ImageNewFromSvg(svg string) (*gtk.Image, error){
  pixbuff, err := gdk.PixbufNewFromDataOnly([]byte(svg))
  if err !=  nil {
    return nil, err
  }
  
  img, err := gtk.ImageNewFromPixbuf(pixbuff)
  
  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){
  pixbuff, err := gdk.PixbufNewFromDataOnly([]byte(svg))
  if err !=  nil {
    return nil, err
  }
  
  img, err := gtk.ImageNewFromPixbuf(pixbuff)
  
  if err !=  nil {
    return nil, err
  }
  
  return img, nil
}

And output:
Output

Go相关问答推荐

gorm如何声明未自动更新的unix时间戳米尔斯字段

如何模拟嵌入. FS?

Golang SDK for DynamoDB:ReturnValuesOnConditionCheckFailure在条件chcek失败发生时不返回条件的详细信息

如何为循环扫描的bufio scanner 设置超时?

使用 OpenTelemetry 统一不同服务的范围

在golang二进制中嵌入SvelteKit

AWS Lambda 中的 Websocket URL 超时达到错误

错误!在为 age-viewer-go 运行 wails dev 或 wails build 命令时

甚至用天真的洗牌分配?

Golang 中的泛型类型转换

go version -m 输出中的箭头符号=>是什么意思?

在 Go 模板中对照片使用随机 Int

github.com/rs/zerolog 字段的延迟判断

Golang 数据库/sql 与 SetMaxOpenConns 挂起

将 Golang Gin 与 AWS Lambda 和无服务器与代理路径一起使用

跟踪长时间运行的任务的进度 - 正确的方法

如何在 Windows 中使用 github.com/AllenDang/giu 和 github.com/gordonklaus/portaudio 构建 GO 程序

如何正确判断 io.Reader 是否为零?

GOENV 只能使用 OS 环境设置

GOLANG 如何使用 http.FileServer 从模板目录加载某个 html 文件