जवाबों:
ImageOptim अपनी Gif संपीड़न के लिए Gifsicle का उपयोग करता है । जहां तक मुझे पता है, यह काफी अच्छी तरह से काम करता है (मैं आमतौर पर इन दिनों जीआईएफ का उपयोग नहीं करता हूं)। उनकी साइट से:
अपने एनिमेशन का अनुकूलन! यह प्रत्येक फ़्रेम के केवल परिवर्तित भाग को संग्रहीत करता है, और आपके GIF को मौलिक रूप से सिकोड़ सकता है। आप उन्हें और भी छोटा बनाने के लिए पारदर्शिता का उपयोग कर सकते हैं। Gifsicle का ऑप्टिमाइज़र बहुत शक्तिशाली है, और आमतौर पर सर्वश्रेष्ठ वाणिज्यिक ऑप्टिमाइज़र के एक जोड़े बाइट के भीतर एनिमेशन को कम कर देता है।
आप जीआईएफ का उपयोग जीआईएफ से कुछ फ्रेम को हटाने के लिए कर सकते हैं और साथ ही फाइल को फिर से जीआईएफ में सेव करके फिर से ऑप्टिमाइज़ कर सकते हैं।
मैं ezgif.com/optimize का उपयोग करता हूं , क्योंकि GIMP और अन्य उपकरण इस काम में अच्छे नहीं हैं। अंतर यह है कि ezgif एक gifsicle
मॉडिफिकेशन (एक lossy
ध्वज के साथ ) का उपयोग करता है , apt
संस्करण पर उपलब्ध नहीं है । यहां 1.82.1 रिलीज देखें ( /usr/bin/gifsicle
अपने सिस्टम के लिए उपयुक्त के साथ बदलें (बाइनरी एंडिंग के साथ -static
)।
एक पूर्ण gif अनुकूलन वर्कफ़्लो पर मेरे नोट्स यहाँ हैं ।
संपादित करें : वर्तमान स्क्रिप्ट जो उपयोग में रखी गई है, यहाँ GitHub पर अपडेट की जाएगी
मैं यह वर्णन नहीं करूँगा कि मैं यह सब यहाँ कैसे करता हूँ, सामान्य विचार कुछ बाश कार्य / उपनाम है:
function gifopt() {
# args: $input_file ($loss_level)
if [ -z "$2" ]
then
# use default of 30
local loss_level=30
elif [[ "$2" =~ ^[0-9]+$ ]] && [ "$2" -ge 30 -a "$2" -le 200 ]
then
local loss_level=$2
else
echo "${2:-"Loss level parameter must be an integer from 30-200"}" 1>&2
exit 1
fi
local inputgif="${1?'Missing input file parameter'}"
local gifname="$(basename $inputgif .gif)"
local basegifname=$(echo "$gifname" | sed 's/_reduced_x[0-9]//g')
local outputgif="$basegifname-opt.gif"
gifsicle -O3 --lossy="$loss_level" -o "$outputgif" "$inputgif";
local oldfilesize=$(du -h $inputgif | cut -f1)
local newfilesize=$(du -h $outputgif | cut -f1)
echo "File reduced from $oldfilesize to $newfilesize as $outputgif"
}
function gifopt() {
# args: $input_file ($loss_level)
if [ -z "$2" ]
then
# use default of 30
loss_level=30
elif [[ "$2" =~ ^[0-9]+$ ]] && [ "$2" -ge 30 -a "$2" -le 200 ]
then
loss_level=$2
else
echo "${2:-"Loss level parameter must be an integer from 30-200"}" 1>&2
exit 1
fi
local inputgif="${1?'Missing input file parameter'}"
local gifname="$(basename $inputgif .gif)"
local basegifname=$(echo "$gifname" | sed 's/_reduced_x[0-9]//g')
local outputgif="$basegifname-opt.gif"
gifsicle -O3 --lossy="$loss_level" -o "$outputgif" "$inputgif";
local oldfilesize=$(du -h $inputgif | cut -f1)
local newfilesize=$(du -h $outputgif | cut -f1)
echo "File reduced from $oldfilesize to $newfilesize as $outputgif"
}
function gifspeedchange() {
# args: $gif_path $frame_delay (1 = 0.1s)
local orig_gif="${1?'Missing GIF filename parameter'}"
local frame_delay=${2?'Missing frame delay parameter'}
gifsicle --batch --delay $frame_delay $orig_gif
local newframerate=$(echo "$frame_delay*10" | bc)
echo "new GIF frame rate: $newframerate ms"
}
--lossy
झंडा तो अच्छी गुणवत्ता के लिए, 200 30 से एक पूर्णांक लेता है:
gifsicle -O3 --lossy=30 -o output.gif input.gif
उपरोक्त फ़ंक्शन के साथ gifopt
आप मामलों को सरल बना सकते हैं, क्योंकि यह 30 तक चूकता है
gifopt input.gif
... आउटपुट स्वचालित रूप से नाम दिया जाएगा input-opt.gif
। आप --batch
इन-प्लेस संपादन के लिए ध्वज का उपयोग करने के लिए फ़ंक्शन बदल सकते हैं, लेकिन मैं आपकी शुरुआती सामग्री को अधिलेखित करने की अनुशंसा नहीं करूंगा।
यह फंक्शन _reduced_x
फ्रेम काउंट रिडक्शन फंक्शन द्वारा जोड़े गए किसी भी प्रत्यय को हटाने का काम करता है , यानी आपके पास एक इंटरमीडिएट फाइल हो सकती है input_reduced_x2.gif
(एक ऐसा कदम जो हर दूसरे फ्रेम को ड्रॉप करके फाइल साइज को आधा कर देगा)।
यदि आपने ऐसा किया है कि गति बदल सकती है, gifspeedchange input-opt.gif 5
उदाहरण के लिए, 50ms फ्रेम देरी का उपयोग करने के लिए तय किया गया है ।
आप अपनी .gif फ़ाइल को Gimp पर आसानी से ऑप्टिमाइज़ कर सकते हैं।
बस .gif के रूप में सहेजें और फिर संपीड़ित करें या .jpeg या अन्य के रूप में अन्य एक्सटेंशन में सहेज सकते हैं।