From 90680bef6cefd5eae1d6bc16740a7ba7d1154041 Mon Sep 17 00:00:00 2001 From: Zhou Zhiqiang Date: Thu, 15 Jun 2023 14:08:08 +0800 Subject: [PATCH] feat: automatic load pages in animated images (#231) * feat: automatic load pages in animated images Signed-off-by: STRRL * chore: remove destination file during test Signed-off-by: STRRL * chore: change import param code style Signed-off-by: STRRL --------- Signed-off-by: STRRL --- encoder.go | 3 +++ encoder_test.go | 5 +++++ pics/gif-animated.gif | Bin 0 -> 18146 bytes 3 files changed, 8 insertions(+) create mode 100644 pics/gif-animated.gif diff --git a/encoder.go b/encoder.go index ad2ecca..df97fde 100644 --- a/encoder.go +++ b/encoder.go @@ -165,8 +165,11 @@ func webpEncoder(p1, p2 string, quality int, extraParams ExtraParams) error { var buf []byte var boolFalse vips.BoolParameter boolFalse.Set(false) + var intMinusOne vips.IntParameter + intMinusOne.Set(-1) img, err := vips.LoadImageFromFile(p1, &vips.ImportParams{ FailOnError: boolFalse, + NumPages: intMinusOne, }) if err != nil { return err diff --git a/encoder_test.go b/encoder_test.go index 48a701a..51e2b3e 100644 --- a/encoder_test.go +++ b/encoder_test.go @@ -96,6 +96,11 @@ func TestWebPEncoder(t *testing.T) { _ = os.Remove(dest) } +func TestAnimatedGIFWithWebPEncoder(t *testing.T) { + runEncoder(t, "./pics/gif-animated.gif", dest) + _ = os.Remove(dest) +} + func TestAvifEncoder(t *testing.T) { // Only one file: img_over_16383px.jpg might cause memory issues on CI environment assert.Nil(t, avifEncoder("./pics/big.jpg", dest, 80, ExtraParams{Width: 0, Height: 0})) diff --git a/pics/gif-animated.gif b/pics/gif-animated.gif new file mode 100644 index 0000000000000000000000000000000000000000..4572b98bd3b4115502b74f83fab1c228f30d1fab GIT binary patch literal 18146 zcmchs$K3?=s>Zz(ZT?J(D6#xhXFfaf# z8jZsNUS7b;%F4^jD*^$0M}V*}kd_9L3P3>~C?5mr>JVXJVJRu8BS$n;R8-W|j;gDx zn*d-3fHMG>00;%(8VAr91!hM;*a@Jc1B{JA_xfqVPQOadU{4i zM&{<`Ha0fy?(RN5K4D?5SFT*SapOh=1e62N2f#1@(*QgNUnwnl*TwGgQd;9k7=g*(_X`k@_>LKtQjzZI( zLxH~-Omru8a56=daL5Zc$5KKLFEeoTOVpKM2oh>VJkiH(a-NK8t;nUb1zD?KAK zD?2AQFaLHyVNr2OX<2#2oyxma)it$s^$m?p%`Nv@+uHAUJm`G*=rOgcyQjCWe_(JZ z3yh9|;mYyxiHfPwnc2A~^F_~|J-_{8ZaIH-YCUgEK=|Ezrm@Z3F%hj3Ur%V`cRpr+ zK7Q;k5IR5bWU7<@cnIja^T9?dV$|T*CM0r*RaE2AvBaPWeXJ;6F?kVrmm9^eDM=A7 zPAw~SKOT>jfTqP^S%ma3_{}sk#a!hGip50J>tc6eB&BmOa#O7|E=7_t*HL(;bTrKb zfr8_Ws?R^8r3w?`?K6fg-mnPn>xWcEsbAho71R&K&hwC8KdW)gc`l>fj$~yC zeFOEA+O2aDjA7&Py)3-5l%sG9f0=7;A(l^5`}2HpMqHY3B}zZjcs&0ot6`Swi(g6w z=e=%R>9ss{{m|pZIm36NX~Mm>o?|7pjjXyrk=?4ws?l8c$F7tNPL)JBjEK_}o3IR%z&-8k4SxmdpY!b}3K zYz1@`rCgo**w1xl6^D%C#q%f^lw(a4$58;UDDpL{`1+Aik4Z;{`1wQrzwc)`B^;ij z7mU~tfboJem_Y%+CuzWS^M}*^bRzmlXM?sPPIZOCV2$*`r>gUP%uZxhh|s-et+dul zezUZ>8lxXQza~EhABtiJ9n`*f%U9XU$+p`A#!3DPLSna70>gzeukcBnE?74pKoD3Z z7itO40N(|VH^+vf6j-_}SkU4rR3-!7j*6=%R7&$mL?uP-N&|IO=ewgwv2>QIrg+b+ zDa`WSJ1F6ayLUvMUx{Qn`HNItd2*lQyrZD?G$*Px*>FsgW45JNmoozp9G=z0*Hj~N zhHKPbw7xZ0WZEHhGijtZ)ICrSN`YXwM;Uq$1Gz?1H@VlBKRi}izh3QI_ht47lj?d( z17;CQ+NRdOnEUW}e}9}L#q#6px-mw1V!3hP=&y5K5PBa##1b&YZvBT86=8iiu@Ioh z;OWI-D_uB}h(Y)K`Y;NF9mVa{K5R8TRvj#AnNl33YQZp(q?f7Km

|A?Hq)rRrXo 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