【问题标题】:Go image upload去图片上传
【发布时间】:2016-09-28 11:51:06
【问题描述】:

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

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

这是被保存的一个

不知道我做错了什么

【问题讨论】:

  • 尝试按原样保存文件,而不是重新编码。
  • 您只是在解码第一帧。来自文档:“解码从 r 读取 GIF 图像并将第一个嵌入图像作为 image.Image 返回”。

标签: image go gif animated-gif


【解决方案1】:

正如 cmets 中所暗示的,您只使用一帧:

func Decode(r io.Reader) (image.Image, error)解码读取一张GIF图片 从 r 中返回第一个嵌入图像作为 image.Image。

但你需要

func DecodeAll(r io.Reader) (*GIF, error) DecodeAll 读取 GIF 图像 来自 r 并返回顺序帧和时序信息。

func EncodeAll(w io.Writer, g *GIF) errorEncodeAll 写入图像 在 GIF 格式的 g 到 w 中,具有给定的循环计数和延迟之间 帧。

查看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)
    }
}

结果:

旁注

即使在我的浏览器 (Firefox) 中我看到输出图像动画,并且我可以看到 GIMP 中的帧,我也无法在我的桌面查看器(gifview、comix)上看到它动画。我不知道(目前)这是什么原因。

【讨论】:

    猜你喜欢
    • 2012-01-29
    • 2012-01-24
    • 2021-03-19
    • 2010-12-02
    • 2010-12-15
    • 1970-01-01
    • 2018-03-22
    相关资源
    最近更新 更多