2016-05-30 2 views
1

я в настоящее время загрузки изображения на мой сервер, выполнив следующие действия:Go изображение загрузить

func (base *GuildController) GuildLogo(w http.ResponseWriter, req *http.Request, ps httprouter.Params) { 
    ... 
    logo, _, err := req.FormFile("logo") 
    defer logo.Close() 
    logoGif, format, err := image.Decode(logo) 
    if err != nil { 
     base.Error = "Error while decoding your guild logo" 
     return 
    } 
    logoImage, err := os.Create(pigo.Config.String("template")+"/public/guilds/"+ps.ByName("name")+".gif") 
    if err != nil { 
     base.Error = "Error while trying to open guild logo image" 
     return 
    } 
    defer logoImage.Close() 
    //resizedLogo := resize.Resize(64, 64, logoGif, resize.Lanczos3) 
    err = gif.Encode(logoImage, logoGif, &gif.Options{ 
     256, 
     nil, 
     nil, 
    }) 
    if err != nil { 
     base.Error = "Error while encoding your guild logo" 
     return 
    } 
    ... 
} 

Так что все работает хорошо. Но gifs теряют анимацию.

Например вот это GIF я хочу, чтобы загрузить

enter image description here

А вот спасенных один

enter image description here

Не уверен, что я делаю неправильно

+3

Попробуйте сохранить файл как есть, а не перекодировать его. – noisypixy

+5

Вы только декодируете первый кадр. Из документации: «Декодирование считывает GIF-изображение из r и возвращает первое внедренное изображение в качестве изображения. Ядро». – JimB

ответ

0

As намекнул в комментариях, вы просто работаете с одним фреймом:

func Decode(r io.Reader) (image.Image, error) декодирования считывает изображение GIF из г и возвращает первый вложенный файл как image.Image.

Но вам нужно

Func DecodeAll (г io.Reader) (* GIF, ошибка) DecodeAll считывает GIF изображение из г и возвращает последовательные кадры и информацию синхронизации.

и

func EncodeAll(w io.Writer, g *GIF) error EncodeAll записывает изображения в г до ж в GIF формате с данным подсчета петель и задержки между кадрами .

Подробнее об this post.

Вот пример, который замедляет изображение на 0,5с каждый кадр:

package main 

import (
    "image/gif" 
    "os" 
) 

func main() { 
    logo, err := os.Open("yay.gif") 
    if err != nil { 
     panic(err) 
    } 
    defer logo.Close() 

    inGif, err := gif.DecodeAll(logo) 
    if err != nil { 
     panic(err) 
    } 

    outGif, err := os.Create("done.gif") 
    if err != nil { 
     panic(err) 
    } 
    defer outGif.Close() 

    for i := range inGif.Delay { 
     inGif.Delay[i] = 50 
    } 
    if err := gif.EncodeAll(outGif, inGif); err != nil { 
     panic(err) 
    } 
} 

Результаты:

Original Image Slowed-down version

примечание стороны

Даже если в моем браузере (Firefox) Я вижу анимацию выходного изображения, и я вижу кадры в GIMP, я не вижу его анимированные на моем рабочем столе зрители (gifview, comix). Я еще не знаю, в чем причина этого.

Смежные вопросы