我目前正在将图像上传到服务器,并执行以下操作:
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
这是保存的
不知道我在做什么错
正如评论中所暗示的,您只使用一个框架:
func Decode(r io.Reader) (image.Image, error)
解码从r读取GIF图像,然后将第一个嵌入的图像作为image.Image返回。
但是你需要
func DecodeAll(r io.Reader)(* GIF,错误)DecodeAll从r读取GIF图像,并返回顺序帧和定时信息。
和
func EncodeAll(w io.Writer, g *GIF) error
EncodeAll使用给定的循环计数和帧之间的延迟,以GIF格式将图像从g写入w。
请查看此帖子以获取详细信息。
这是一个将图像的速度减慢至每帧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)上看到它的动画。我尚不知道是什么原因。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句