首頁  >  文章  >  後端開發  >  如何使用 GOTK3 和 librsvg 在 Go 中載入內聯 SVG?

如何使用 GOTK3 和 librsvg 在 Go 中載入內聯 SVG?

PHPz
PHPz轉載
2024-02-08 23:40:08811瀏覽

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

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中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除