2
我用這個片段保存按Base64編碼和JSON發送的圖像文件:GIF動畫無法正確保存
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)
}
它工作正常的png
和jpeg
但動畫gif
圖像保存爲靜止圖像,或在某些圖像查看器中根本不顯示。我想知道如何解決這個問題?
感謝您的提示。實際上它應該是'decodedImage,err:= gif.Decode(imageReader);',因爲函數只返回2個值。我試過這個,但仍然有同樣的問題:一些圖像查看器根本不顯示保存的gif。 Firefox爲gif提供了畫筆,但動畫卻丟失了。 – Karlom