मैं ImageMagick का उपयोग करके एनिमेटेड GIF फ़ाइल का आकार कैसे बदल सकता हूं?


46

मैं ऐसी एनिमेटेड GIF फ़ाइल do.gif का आकार बदलना चाहता हूं यहाँ छवि विवरण दर्ज करें

अगर मुझे लगता है कि convert do.gif -resize 24x24\! do-24.gifमैं इसे 24 -जीआईएफ में रिसाइज करूं, लेकिन एनिमेटेड नहींयहाँ छवि विवरण दर्ज करें

समान एनीमेशन प्राप्त करने के लिए इसे सही तरीके से कैसे बदला जाए?

जवाबों:


56

प्रथम रन:

convert do.gif -coalesce temporary.gif

फिर

convert -size <original size> temporary.gif -resize 24x24 smaller.gif

2
-coalesce"प्रत्येक बिंदु पर एनीमेशन का एक पूरा दृश्य बनाता है, एक एनीमेशन अनुक्रम के बजाय एक सच्ची फिल्म पट्टी की तरह एक सा है। इस तरह के एक अनुक्रम, जिसे एक Coalesced एनीमेशन के रूप में जाना जाता है , अध्ययन, संपादन, संशोधित और पुन: अनुकूलन के लिए बहुत आसान है।"
सैम

28
gifsicle --resize 24x24 > do-24.gifयह भी कर सकते हैं
सैम

2
ध्यान दें कि समन्वित दृश्य अनुकूलित (मेरे परीक्षण में 3.2 बार) की तुलना में बहुत बड़ा है, और आकार बदलने से एक coalesced छवि का उत्पादन होता है, जो फ़ाइल आकार में मूल से भी बड़ा हो सकता है (संकल्प में 2.3 बार) छोटा है। जब मैं सीधे आकार बदलने की कोशिश करता हूं तो यह ठीक दिखता है और एक छोटा फ़ाइल आकार होता है, हालांकि शायद यह इस छवि के लिए काम करता है।
21

1
gifsicle ने मेरे उपयोग के मामले के लिए एक बेहतर, अनुकूलित आउटपुट तैयार किया। धन्यवाद @sam!
sj26

4
अस्थायी रूप से परिवर्तित करें। इनपुट आकार निर्दिष्ट किए बिना, मेरे लिए 24x24 छोटे आकार पर काम करें।
अंब

3

-coalesce + -deconstruct

के बाद -coalesce, आप संभवतः जोड़ना चाहते हैं -deconstruct:

convert in.gif -coalesce -resize 256x -deconstruct out-deconstruct.gif

समस्या का मूल कारण यह है कि आपके इनपुट जीआईएफ को ठीक से छोटा किया गया था: जीआईएफ अगले फ्रेम को एक ऑफसेट पर पिछले एक से केवल संशोधित आयत बनाने की अनुमति देता है।

-coalesceफिर सभी फ़्रेमों को मूल आकार में विस्तारित करता है, जो आकार परिवर्तन का काम करता है, लेकिन यह आपके इनपुट छवि के रूप में फिर से फ़्रेमों को फिर से संपीड़ित नहीं करता है: इसके -deconstructलिए आवश्यक है!

इस उत्तर से परीक्षण डेटा का उपयोग करना: मैं अभी भी छवियों से एक एनिमेटेड GIF कैसे बनाऊंगा (अधिमानतः कमांड लाइन के साथ)? हम इसे स्पष्ट रूप से देख सकते हैं identify:

$ identify out-convert.gif | head -n 3
out-convert.gif[0] GIF 1024x1024 1024x1024+0+0 8-bit sRGB 256c 16.7865MiB 0.020u 0:00.019
out-convert.gif[1] GIF 516x516 1024x1024+252+257 8-bit sRGB 256c 16.7865MiB 0.030u 0:00.019
out-convert.gif[2] GIF 515x520 1024x1024+248+257 8-bit sRGB 256c 16.7865MiB 0.030u 0:00.019

$ convert out-convert.gif -resize 256x out.gif
$ identify out.gif | head -n 3
out.gif[0] GIF 256x256 256x256+0+0 8-bit sRGB 256c 5.0479MiB 0.000u 0:00.009
out.gif[1] GIF 256x256 256x256+125+128 8-bit sRGB 256c 5.0479MiB 0.000u 0:00.009
out.gif[2] GIF 256x258 256x256+123+128 8-bit sRGB 256c 5.0479MiB 0.000u 0:00.009

$ convert out-convert.gif -coalesce -resize 256x out-coalesce.gif
$ identify out-coalesce.gif | head -n 3
out-coalesce.gif[0] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.97683MiB 0.010u 0:00.009
out-coalesce.gif[1] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.97683MiB 0.010u 0:00.009
out-coalesce.gif[2] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.97683MiB 0.010u 0:00.009

$ convert out-convert.gif -coalesce -resize 256x -deconstruct out-deconstruct.gif
$ identify out-deconstruct.gif | head -n 3
out-deconstruct.gif[0] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.87942MiB 0.010u 0:00.010
out-deconstruct.gif[1] GIF 135x135 256x256+60+61 8-bit sRGB 256c 1.87942MiB 0.010u 0:00.010
out-deconstruct.gif[2] GIF 135x136 256x256+59+61 8-bit sRGB 256c 1.87942MiB 0.010u 0:00.010

out.gif

यहाँ छवि विवरण दर्ज करें

बाहर coalesce.gif

यहाँ छवि विवरण दर्ज करें

बाहर deconstruct.gif

यहाँ छवि विवरण दर्ज करें

सबसे पहले, हम देखते हैं कि इनपुट फ़ाइल कैसे होती है, out-convert.gifवास्तव में संकुचित थी, क्योंकि फ्रेम 2 केवल 516x516ऑफसेट पर है 252+257, जबकि पूर्ण आकार का फ्रेम 1 है 1024x1024

फिर, यदि हम तीन रूपांतरणों की तुलना करते हैं:

  • out.gif: सभी फ्रेम 256x2565MiB, TODO में बड़े या बड़े और विशाल क्यों हैं?

    दृश्य रूप से गलत है, क्योंकि उन लगभग 256x256फ़्रेमों में एक गैर-शून्य ऑफसेट है, जैसे 125+128फ्रेम 2 के लिए!

  • out-coalesce.gif: सभी फ्रेम हैं 256x256और सही ऑफसेट है 0+0

    आउटपुट नेत्रहीन रूप से सही दिखता है, लेकिन आउटपुट फ़ाइल का आकार 2.0 MiB है, जो इससे बड़ा है out-deconstruct.gif

  • out-deconstruct.gif: संपीड़ित फ़्रेम, अंतिम आउटपुट आकार 1.9 MiB।

    की तुलना में बहुत छोटा नहीं है out-coalesce.gif, लेकिन मुझे लगता है कि यह सिर्फ इसलिए है क्योंकि काली जमीन वास्तव में अच्छी तरह से संपीड़ित करती है, और यह सामान्य रूप से बहुत महत्वपूर्ण हो सकती है।

ffmpeg और gifsicle

मैंने निम्नलिखित आदेश भी आज़माए:

ffmpeg -i out-convert.gif -vf scale=256:-1 out-ffmpeg-small.gif
gifsicle --resize 256x256 out-convert.gif > out-gifsicle.gif

और दोनों ने 1.5 मि.बी. आउटपुट को देखते हुए और भी छोटा उत्पादन किया।

यह भी देखें: मैं अभी भी छवियों से एक एनिमेटेड GIF कैसे बना सकता हूं (अधिमानतः कमांड लाइन के साथ)?

TODO: वे इसे से छोटा क्यों बना सकते हैं convert? क्या वे सिर्फ बेहतर न्यूनतम न्यूनतम आयतों, या कुछ और का चयन कर रहे हैं?

उबंटू 18.10, ffpmeg 4.0.2-2, ImageMagick 6.9.10-8 में परीक्षण किया गया।


3

मैं इमेजमैजिक समाधान की तलाश में था क्योंकि मैं इससे परिचित हूं, लेकिन अंत में मैं @ सैम के सुझाव के साथ गया gifsicle। यह वही हुआ जो मैं चाहता था, कोई परेशानी नहीं।

इतने सारे तरीकों से परिणामी फ़ाइल आकार का अनुकूलन कर सकते हैं, लेकिन मैं सिर्फ आकार को कम करने और रंगों की संख्या को कम करने के साथ चला गया। एक जादू की तरह काम किया:

gifsicle --resize 48x48 --colors 16 original.gif > smaller.gif
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.