2017-08-17 92 views
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) 
    } 

它工作正常的pngjpeg但動畫gif圖像保存爲靜止圖像,或在某些圖像查看器中根本不顯示。我想知道如何解決這個問題?

回答

1

您的編碼部分是正確的,但是對於解碼,您應該使用image/gif包。

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

感謝您的提示。實際上它應該是'decodedImage,err:= gif.Decode(imageReader);',因爲函數只返回2個值。我試過這個,但仍然有同樣的問題:一些圖像查看器根本不顯示保存的gif。 Firefox爲gif提供了畫筆,但動畫卻丟失了。 – Karlom