From 2c1ddf07d22b1e7e598eb0171f9ed801233d3687 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A1=9C=E8=8F=AF?= Date: Thu, 6 Apr 2023 13:56:34 +0800 Subject: [PATCH] gif to webp --- bin/main.go | 32 +++++++++++++++++++++++++------- go.mod | 3 ++- go.sum | 7 ++++--- 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/bin/main.go b/bin/main.go index b2f4c63..b9e0801 100644 --- a/bin/main.go +++ b/bin/main.go @@ -2,20 +2,31 @@ package main import ( "image" - "image/gif" "log" "net/http" "os" + "runtime" "regexp" "strconv" "github.com/chai2010/webp" "github.com/disintegration/imaging" + giftowebp "github.com/sizeofint/gif-to-webp" ) +type Image struct { + FilePath string + Data []byte + ImageType int + Ext string + Width int + Height int +} + // 实现一个 web api 服务(获取指定尺寸的图片) func main() { + runtime.GOMAXPROCS(runtime.NumCPU()) http.HandleFunc("/img/", func(w http.ResponseWriter, r *http.Request) { @@ -65,20 +76,27 @@ func main() { // 如果是 GIF 格式的动态图片,直接返回 if ext == "gif" { - giffile, err := os.Open("data/test.gif") + gifBin, err := os.ReadFile("data/test.gif") if err != nil { - log.Println("打开文件失败", err) + log.Println("读取文件失败", err) w.WriteHeader(http.StatusBadRequest) return } - defer giffile.Close() - gifimg, err := gif.DecodeAll(giffile) + + converter := giftowebp.NewConverter() + converter.LoopCompatibility = false + converter.WebPConfig.SetLossless(0) // 0 有损压缩 1无损压缩 + converter.WebPConfig.SetMethod(6) // 压缩速度 0-6 0最快 6质量最好 + converter.WebPConfig.SetQuality(10) // 压缩质量 0-100 + converter.WebPAnimEncoderOptions.SetKmin(9) + converter.WebPAnimEncoderOptions.SetKmax(17) + webpBuf, err := converter.Convert(gifBin) if err != nil { - log.Println("解码图像失败", err) + log.Println("编码图像失败", err.Error()) w.WriteHeader(http.StatusBadRequest) return } - gif.EncodeAll(w, gifimg) + w.Write(webpBuf) return } diff --git a/go.mod b/go.mod index 8bbe140..62ad0f1 100644 --- a/go.mod +++ b/go.mod @@ -4,9 +4,10 @@ go 1.18 require github.com/disintegration/imaging v1.6.2 -require github.com/sizeofint/webpanimation v0.0.0-20210809145948-1d2b32119882 // indirect +require github.com/sizeofint/webp-animation v0.0.0-20190207194838-b631dc900de9 // indirect require ( github.com/chai2010/webp v1.1.1 + github.com/sizeofint/gif-to-webp v0.0.0-20210224202734-e9d7ed071591 golang.org/x/image v0.0.0-20211028202545-6944b10bf410 // indirect ) diff --git a/go.sum b/go.sum index b005707..5bc70ae 100644 --- a/go.sum +++ b/go.sum @@ -2,9 +2,10 @@ github.com/chai2010/webp v1.1.1 h1:jTRmEccAJ4MGrhFOrPMpNGIJ/eybIgwKpcACsrTEapk= github.com/chai2010/webp v1.1.1/go.mod h1:0XVwvZWdjjdxpUEIf7b9g9VkHFnInUSYujwqTLEuldU= github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c= github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4= -github.com/sizeofint/webpanimation v0.0.0-20210809145948-1d2b32119882 h1:A7o8tOERTtpD/poS+2VoassCjXpjHn916luXbf5QKD0= -github.com/sizeofint/webpanimation v0.0.0-20210809145948-1d2b32119882/go.mod h1:5IwJoz9Pw7JsrCN4/skkxUtSWT7myuUPLhCgv6Q5vvQ= -golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8 h1:hVwzHzIUGRjiF7EcUjqNxk3NCfkPxbDKRdnNE1Rpg0U= +github.com/sizeofint/gif-to-webp v0.0.0-20210224202734-e9d7ed071591 h1:dCWBD4Xchp/XFIR/x6D2l74DtQHvIpHsmpPRHgH9oUo= +github.com/sizeofint/gif-to-webp v0.0.0-20210224202734-e9d7ed071591/go.mod h1:IXC7KN2FEuTEISdePm37qcFyXInAh6pfW35yDjbdfOM= +github.com/sizeofint/webp-animation v0.0.0-20190207194838-b631dc900de9 h1:i3LYMwQ0zkh/BJ47vIZN+jBYqV4/f6DFoAsW8rwV490= +github.com/sizeofint/webp-animation v0.0.0-20190207194838-b631dc900de9/go.mod h1:/NQ8ciRuH+vxYhrFlnX70gvXBugMYQbBygCRocFgSZ4= golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20211028202545-6944b10bf410 h1:hTftEOvwiOq2+O8k2D5/Q7COC7k5Qcrgc2TFURJYnvQ= golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=