ฉันมี 2.0 mb gif ฉันต้องการที่จะทำให้เล็กลงโดยเฉพาะอย่างยิ่งโดยการวางบางเฟรม
มียูทิลิตีบรรทัดคำสั่งหรือโปรแกรมที่จะทำเพื่อฉันโดยอัตโนมัติหรือไม่?
ขอบคุณ
ฉันมี 2.0 mb gif ฉันต้องการที่จะทำให้เล็กลงโดยเฉพาะอย่างยิ่งโดยการวางบางเฟรม
มียูทิลิตีบรรทัดคำสั่งหรือโปรแกรมที่จะทำเพื่อฉันโดยอัตโนมัติหรือไม่?
ขอบคุณ
คำตอบ:
ImageOptim ใช้Gifsicleสำหรับการบีบอัด Gif เท่าที่ฉันรู้มันใช้งานได้ค่อนข้างดี (โดยทั่วไปฉันไม่ได้ใช้ Gif ในปัจจุบัน) จากเว็บไซต์ของพวกเขา:
ปรับปรุงภาพเคลื่อนไหวของคุณ! วิธีนี้จะเก็บเฉพาะส่วนที่เปลี่ยนแปลงของแต่ละเฟรมและสามารถลดขนาด 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
ธงจะใช้เวลาเป็นจำนวนเต็ม 30-200 เพื่อให้คุณภาพที่ดีที่สุด:
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 หรืออื่น ๆ