Go基于base64的图像解码

4

我目前正在从画布中获取一个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

所以,我制作数据URL的方式可能是错误的,但是我不知道该怎么做。我还尝试传递完整的数据URL(包括data:image...),但仍然没有成功。


我认为您没有收到有效的base64数据。运行echo -n“iVKhdfjdAjdfirtn =”| base64 -d> image.png也表明您的数据无效。 - user142162
那只是一个例子,我获取的dataurl非常大,无法在此处放置。 - Raggaer
1个回答

10
你手头的是一个数据URI方案,如何解码以及更多信息可以在这个问题和答案中找到:

使用base64.StdEncoding.DecodeString(str)时输入字节4处出现非法的base64数据

但请注意,image.Decodeconfig()只能解码在调用此函数之前注册的图像格式,因此您需要事先注册图像格式处理程序。可以通过导入以下方式完成:

import _ "image/png"

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

因此,它对您不起作用,因为您实际编码的图像是PNG格式,但您没有注册PNG格式处理程序,所以image.DecodeConfig()将不使用PNG处理程序(因此它将无法解码它=>“未知图像格式”)。

还要注意,替换不是Base64编码图像的前缀是消除其的不良解决方案。而是简单地切片输入字符串:

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

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

你能否更新这个答案,使其适用于jpg和png图像? - Manish Champaneri
@mchampaneri - 只需导入 image/jpeg 并使用 jpeg.DecodeConfig(reader),您就可以开始了。 - John Cargo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接