去图片上传

我目前正在将图像上传到我的服务器,执行以下操作:


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

    }

    ...

}

所以一切都很好。但是 gif 会丢失动画。


例如,这是我要上传的 gif

http://img.mukewang.com/61e4cee1000178fa00680063.jpg

这是得救的

http://img2.mukewang.com/61e4cef20001247300680062.jpg

不知道我做错了什么


开满天机
浏览 145回答 1
1回答

米脂

正如评论中所暗示的,您只使用一帧:func Decode(r io.Reader) (image.Image, error)Decode 从 r 读取 GIF 图像并将第一个嵌入图像作为 image.Image 返回。但是你需要func DecodeAll(r io.Reader) (*GIF, error) DecodeAll 从 r 读取 GIF 图像并返回顺序帧和时序信息。和func EncodeAll(w io.Writer, g *GIF) error EncodeAll 将 g 中的图像以 GIF 格式写入 w,并具有给定的循环计数和帧之间的延迟。详情请看这篇文章。这是一个将图像减慢到每帧 0.5 秒的示例:package mainimport (    "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)    }}结果:边注即使在我的浏览器(Firefox)中我看到输出图像动画,并且我可以看到 GIMP 中的帧,我也无法在我的桌面查看器(gifview、comix)上看到它动画。我不知道(尚)这是什么原因。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go