【问题标题】:Go base64 image decode去base64图像解码
【发布时间】:2015-10-24 15:21:36
【问题描述】:

我目前正在从类似这样的画布中获取 base64 图像数据 url(而不是只是为了显示字符串的外观而获取的 dataurl)

data:image/png;base64,iVkhdfjdAjdfirtn=

我需要对该图像进行解码以检查图像的宽度和高度

    dataurl := strings.Replace(req.PostFormValue("dataurl"), "data:image/png;base64,", "", 1)

    reader := base64.NewDecoder(base64.StdEncoding, strings.NewReader(dataurl))
    c, _, err := image.DecodeConfig(reader)
    if err != nil {
        log.Fatal(err)
    }
    log.Println(c.Width)

但我在尝试解码配置时遇到错误

Unknown image format

所以是的,我制作 dataurl 的方式一定是错误的,但不知道该怎么做。我还尝试传递完整的 dataurl(带有 data:image...)仍然没有成功

【问题讨论】:

  • 我认为您没有收到有效的 base64 数据。运行echo -n "iVkhdfjdAjdfirtn=" | base64 -d > image.png也表示你的数据无效。
  • 这是一个例子,我得到的 dataurl 放在这里很重要

标签: image go base64


【解决方案1】:

您拥有的是Data URI scheme,有关如何解码它的信息以及更多关于此的信息都在这个问答中:

Illegal base64 data at input byte 4 when using base64.StdEncoding.DecodeString(str)

但请注意,image.Decodeconfig() 只会解码在调用此函数之前注册的图像格式,因此您需要提前注册图像格式处理程序。这可以通过像

这样的导入来完成
import _ "image/png"

更多信息在image 的包文档中。或者,如果您知道确切的格式(例如,在您的示例中是 PNG),您可以直接使用 png.DecodeConfig()

所以它对你不起作用,因为你的实际编码图像是 PNG 格式,但你没有注册 PNG 格式处理程序,所以image.DecodeConfig() 不会使用 PNG 处理程序(所以它不会能够解码它 => "Unknown image format")。

另请注意,替换不属于 Base64 编码图像的前缀是摆脱它的糟糕解决方案。而是简单地对输入字符串进行切片:

input := "data:image/png;base64,iVkhdfjdAjdfirtn="
b64data := input[strings.IndexByte(input, ',')+1:]

切片字符串甚至不会复制内存中的字符串,它只会创建一个新的(两个字)字符串头。

【讨论】:

  • 你能更新这个可用于 jpg 和 png 图像的答案
  • @mchampaneri - 只需导入 image/jpeg 并使用 jpeg.DecodeConfig(reader) 就可以了。
猜你喜欢
  • 2012-06-21
  • 1970-01-01
  • 2013-10-25
  • 2020-07-23
  • 1970-01-01
  • 2012-10-05
  • 2012-01-23
  • 1970-01-01
相关资源
最近更新 更多