去base64图像解码

时间:2015-10-24 15:21:36

标签: image go base64

我目前从画布中得到一个base64图像数据网址(不是数据库,只是为了显示字符串的样子)

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(数据:图像......)仍然没有成功

1 个答案:

答案 0 :(得分:4)

你拥有的是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处理程序(所以它将无法对其进行解码=&gt; "Unknown image format")。

另请注意,替换不属于Base64编码图像的前缀是一个很好的解决方案,以摆脱它。而只是切片输入字符串:

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

切换字符串甚至不会将字符串复制到内存中,它只会创建一个新的(双字)字符串标题。