动画gif未正确保存

时间:2017-08-17 08:53:25

标签: go animated-gif

我使用此代码段保存编码为base64且从json发送的图像文件:

func SaveBase64ImageToDisk(imageString string) (interface{}, error) {
    imageExt := strings.ToLower(strings.Split(strings.Split(imageString, ";")[0], "/")[1])
    imageData := strings.Split(imageString, ";base64,")[1]
    imageReader := base64.NewDecoder(base64.StdEncoding, strings.NewReader(imageData))

    if decodedImage, _, err := image.Decode(imageReader); err != nil {
        return nil, err
    } else {
        imageFileName, _ := _saveImage(imageExt, &decodedImage)

        return imageFileName.(string), nil
    }
}

    func _saveImage(imageExt string, decodedImage *image.Image) (interface{}, error) {

        dir, err := os.Getwd()
        if err != nil {
            log.Fatal(err)
        }

        path := dir + "/media/photos/"
        imageFileName := getRandomFileName("randomstr") + "." + imageExt
        if imageFile, err := os.Create(path + imageFileName); err != nil {
            return nil, err
        } else {
            defer imageFile.Close()
            if imageExt == "png" {
                if err = png.Encode(imageFile, *decodedImage); err != nil {
                    return nil, err
                }
            } else if imageExt == "jpg" {
                if err = jpeg.Encode(imageFile, *decodedImage, nil); err != nil {
                    return nil, err
                }
            } else if imageExt == "gif" {
                if err = gif.Encode(imageFile, *decodedImage, nil); err != nil {
                    return nil, err
                }
            }
            return imageFileName, nil
        }
    }

    func getRandomFileName(prefix string) string {
        rand.Seed(time.Now().UTC().UnixNano())
        l := len(prefix)
        result := make([]byte, l)
        for i := 0; i < l; i++ {
            result[i] = CHARS[rand.Intn(len(CHARS))]
        }
        return string(result)
    }

它适用于pngjpeg,但动画gif图像会保存为静止图像,或者在某些图像查看器中根本不显示。我想知道如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

您的编码部分是正确的,但是对于解码,您应该使用image/gif包。

decodedImage, _, err := gif.Decode(imageReader)