Câu trả lời:
ImageOptim sử dụng Gifsicle để nén Gif. Theo như tôi biết, nó hoạt động khá tốt (tôi thường không sử dụng Gif những ngày này). Từ trang web của họ:
Tối ưu hóa hình ảnh động của bạn! Điều này chỉ lưu trữ phần đã thay đổi của mỗi khung và có thể thu nhỏ triệt để ảnh GIF của bạn. Bạn cũng có thể sử dụng độ trong suốt để làm cho chúng nhỏ hơn nữa. Trình tối ưu hóa của Gifsicle khá mạnh mẽ và thường làm giảm hình ảnh động trong một vài byte của trình tối ưu hóa thương mại tốt nhất.
Tôi sử dụng ezgif.com/optizes , vì GIMP và các công cụ khác không tốt trong công việc này. Sự khác biệt là ezgif sử dụng một gifsicle
sửa đổi (với một lossy
cờ), không có sẵn trên apt
phiên bản. Xem bản phát hành 1.82.1 tại đây (thay thế /usr/bin/gifsicle
bằng bản thích hợp cho hệ thống của bạn (phần nhị phân kết thúc bằng -static
).
Ghi chú của tôi về một quy trình tối ưu hóa gif đầy đủ có ở đây .
Chỉnh sửa : tập lệnh hiện tại khi được sử dụng sẽ được cập nhật trên GitHub tại đây
Tôi sẽ không mô tả cách tôi làm tất cả ở đây, ý tưởng chung là một vài hàm bash / bí danh:
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"
}
Các --lossy
lá cờ có một số nguyên 30-200, vì vậy đối với chất lượng tốt nhất:
gifsicle -O3 --lossy=30 -o output.gif input.gif
Với chức năng trên, gifopt
bạn có thể đơn giản hóa các vấn đề, vì nó mặc định là 30
gifopt input.gif
... đầu ra sẽ được tự động đặt tên input-opt.gif
. Bạn có thể thay đổi chức năng để sử dụng --batch
cờ để chỉnh sửa tại chỗ nhưng tôi không khuyên bạn nên ghi đè tài liệu bắt đầu của bạn.
Hàm đó cũng hoạt động để loại bỏ bất kỳ _reduced_x
hậu tố nào được thêm bởi chức năng giảm số lượng khung, tức là bạn có thể có một tệp trung gian input_reduced_x2.gif
(một bước có thể giảm một nửa kích thước tệp bằng cách bỏ mọi khung hình khác).
Nếu bạn đã làm điều đó, tốc độ có thể thay đổi, gifspeedchange input-opt.gif 5
ví dụ như đã sửa, để sử dụng độ trễ khung hình 50ms.
Bạn có thể tối ưu hóa tệp .gif của mình trên Gimp một cách dễ dàng.
Chỉ cần lưu dưới dạng .gif và sau đó nén hoặc bạn có thể lưu trong phần mở rộng khác dưới dạng .jpeg hoặc khác.