Go base64图像解码
Go base64 image decode
我目前从 canvas 中获取 base64 图像数据 url 类似这样(不是数据url 我只是为了展示字符串的样子)
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
所以是的,我制作数据的方式url 一定是错误的,但不知道该怎么做。我也尝试传递完整数据url(data:image...)仍然没有成功
您拥有的是一个 Data URI scheme,有关如何对其进行解码的信息以及更多相关信息,请参见此问答:
Illegal base64 data at input byte 4 when using base64.StdEncoding.DecodeString(str)
但请注意image.Decodeconfig()
只会解码在调用此函数之前注册的图像格式,因此您需要提前注册图像格式处理程序。这可以通过像
这样的导入来完成
import _ "image/png"
image
. Or if you know the exact format (e.g. in your example it's PNG), you can directly use png.DecodeConfig()
.
的包文档中有更多相关信息
所以它对你不起作用,因为你的实际编码图像是 PNG 格式,但你没有注册 PNG 格式处理程序,所以 image.DecodeConfig()
不会使用 PNG 处理程序(并且所以它将无法解码 => "Unknown image format"
).
另请注意,替换不属于 Base64 编码图像的前缀并不是摆脱它的糟糕解决方案。而是简单地对输入字符串进行切片:
input := "data:image/png;base64,iVkhdfjdAjdfirtn="
b64data := input[strings.IndexByte(input, ',')+1:]
切片字符串甚至不会复制内存中的字符串,它只会创建一个新的 (two-word) 字符串 header.
我目前从 canvas 中获取 base64 图像数据 url 类似这样(不是数据url 我只是为了展示字符串的样子)
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
所以是的,我制作数据的方式url 一定是错误的,但不知道该怎么做。我也尝试传递完整数据url(data:image...)仍然没有成功
您拥有的是一个 Data URI scheme,有关如何对其进行解码的信息以及更多相关信息,请参见此问答:
Illegal base64 data at input byte 4 when using base64.StdEncoding.DecodeString(str)
但请注意image.Decodeconfig()
只会解码在调用此函数之前注册的图像格式,因此您需要提前注册图像格式处理程序。这可以通过像
import _ "image/png"
image
. Or if you know the exact format (e.g. in your example it's PNG), you can directly use png.DecodeConfig()
.
所以它对你不起作用,因为你的实际编码图像是 PNG 格式,但你没有注册 PNG 格式处理程序,所以 image.DecodeConfig()
不会使用 PNG 处理程序(并且所以它将无法解码 => "Unknown image format"
).
另请注意,替换不属于 Base64 编码图像的前缀并不是摆脱它的糟糕解决方案。而是简单地对输入字符串进行切片:
input := "data:image/png;base64,iVkhdfjdAjdfirtn="
b64data := input[strings.IndexByte(input, ',')+1:]
切片字符串甚至不会复制内存中的字符串,它只会创建一个新的 (two-word) 字符串 header.