如何创建 svg 并将其导出为 png/jpeg

Posted

技术标签:

【中文标题】如何创建 svg 并将其导出为 png/jpeg【英文标题】:How to create and export svg to png/jpeg 【发布时间】:2021-10-13 05:36:46 【问题描述】:

我有以下代码 sn-p 例如

package main

import (
    "github.com/ajstarks/svgo"
    "os"
    _ "image"
    _ "fmt"
)

func main()
    width := 512
    height := 512

    canvas := svg.New(os.Stdout)
    canvas.Start(width,height)
    canvas.Image(0,0,512,512,"src.jpg","0.50")
    canvas.End()

我想将此代码创建的 svg 导出为 jpeg 或 png 或 svg 让我们说。如何做到这一点我不明白。我可以使用 imagemagick 或其他东西,但为此我需要 SVG 的东西。请有人帮我解决这个问题。

【问题讨论】:

我可以知道对谁投反对票的原因吗? Golang 很容易与 javascript 结合。您可以考虑使用 Javascript 来执行此操作,如果需要,您仍然可以使用 fetch 发送它以与 Go 进行通信。我构建了一个script,通过Javascript将SVG转换为PNG,你可以做一些修改来实现。 【参考方案1】:

如果你更喜欢使用纯 go

package main

import (
  "image"
  "image/png"
  "os"

  "github.com/srwiley/oksvg"
  "github.com/srwiley/rasterx"
)

func main() 
  w, h := 512, 512

  in, err := os.Open("in.svg")
  if err != nil 
    panic(err)
  
  defer in.Close()

  icon, _ := oksvg.ReadIconStream(in)
  icon.SetTarget(0, 0, float64(w), float64(h))
  rgba := image.NewRGBA(image.Rect(0, 0, w, h))
  icon.Draw(rasterx.NewDasher(w, h, rasterx.NewScannerGV(w, h, rgba, rgba.Bounds())), 1)

  out, err := os.Create("out.png")
  if err != nil 
    panic(err)
  
  defer out.Close()

  err = png.Encode(out, rgba)
  if err != nil 
    panic(err)
  

【讨论】:

谢谢!如果我在这里使用你的代码可以吗? (代码注释链接到您的用户个人资料和此问题。)github.com/trashhalo/imgcat/pull/16/files 为了让代码更通用,去掉w, h := 512, 512,在icon, _ := oksvg.ReadIconStream(in)之后直接添加w := int(icon.ViewBox.W) h := int(icon.ViewBox.H)【参考方案2】:

要输出 .svg 文件,只需将文件 Writer 传递给 svg.New

f, err := os.Create("my_new_svg.svg")
... handle error
canvas := svg.New(f)

这会将您的输出保存在 my_new_svg.svg 中。完成此操作后,您可以在自己喜欢的网络浏览器等中打开。我猜想获取 .png 或 .jpeg 的最简单方法是使用一些外部工具(如 Image Magick)

【讨论】:

以上是关于如何创建 svg 并将其导出为 png/jpeg的主要内容,如果未能解决你的问题,请参考以下文章

将 SVG 转换为 PNG/JPEG,而不在无服务器函数中使用画布

Fabric.JS 与 Node.JS - 导出为 PNG/JPEG

Qt:如何将 2 个 QQuickItems 合并为一个,然后将其保存为 png

如何在highcharts中更改导出文件名

如何在 C# 中将 SVG 文件转换为 EMF 文件

adobexd导出的svg代码html