Câu trả lời:
lần chạy đầu tiên:
convert do.gif -coalesce temporary.gif
sau đó
convert -size <original size> temporary.gif -resize 24x24 smaller.gif
gifsicle --resize 24x24 > do-24.gif
cũng có thể như vậy
-coalesce
+ -deconstruct
Sau đó -coalesce
, bạn có thể muốn thêm một -deconstruct
:
convert in.gif -coalesce -resize 256x -deconstruct out-deconstruct.gif
Nguyên nhân cốt lõi của vấn đề là GIF đầu vào của bạn đã được thu nhỏ đúng cách: GIF cho phép khung tiếp theo chỉ là hình chữ nhật được sửa đổi từ khung trước đó ở phần bù.
-coalesce
sau đó mở rộng tất cả các khung thành kích thước ban đầu, điều này làm cho việc thay đổi kích thước hoạt động, nhưng nó không nén lại các khung như hình ảnh đầu vào của bạn: -deconstruct
là cần thiết cho điều đó!
Sử dụng dữ liệu thử nghiệm từ câu trả lời này: Làm cách nào để tạo gif hoạt hình từ hình ảnh tĩnh (tốt nhất là với dòng lệnh)? chúng ta có thể thấy rõ điều này với 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
ra-coalesce.gif
out-deconstruct.gif
Đầu tiên, chúng ta thấy cách nhập tệp, out-convert.gif
trên thực tế đã được nén, vì khung 2 chỉ 516x516
ở mức bù 252+257
, trong khi khung 1 có kích thước đầy đủ là 1024x1024
.
Sau đó, nếu chúng ta so sánh ba chuyển đổi:
out.gif
: Tất cả các khung đều 256x256
lớn hơn và lớn hơn khoảng 5MiB, TODO tại sao?
Trực quan không chính xác, vì các 256x256
khung xấp xỉ đó có độ lệch khác không, ví dụ 125+128
cho khung 2!
out-coalesce.gif
: tất cả các khung đều có 256x256
và có độ lệch chính xác 0+0
.
Đầu ra trông có vẻ chính xác, nhưng kích thước tệp đầu ra là 2.0 MiB, lớn hơn out-deconstruct.gif
out-deconstruct.gif
: khung nén, kích thước đầu ra cuối cùng 1.9 MiB.
Không nhỏ hơn đáng kể out-coalesce.gif
, nhưng tôi nghĩ rằng điều này chỉ là do mặt đất đen nén rất tốt, và nó có thể rất có ý nghĩa nói chung.
ffmpeg và gifsicle
Tôi cũng đã thử các lệnh sau:
ffmpeg -i out-convert.gif -vf scale=256:-1 out-ffmpeg-small.gif
gifsicle --resize 256x256 out-convert.gif > out-gifsicle.gif
và cả hai đều tạo ra một đầu ra 1,5 MiB chính xác thậm chí còn nhỏ hơn.
Xem thêm: Làm cách nào để tạo ảnh gif hoạt hình từ ảnh tĩnh (tốt nhất là với dòng lệnh)?
TODO: tại sao họ có thể làm cho nó nhỏ hơn convert
? Có phải họ chỉ chọn hình chữ nhật khác tối thiểu tốt hơn, hoặc cái gì khác?
Đã thử nghiệm trong Ubuntu 18.10, ffpmeg 4.0.2-2, ImageMagick 6.9.10-8.
Tôi đã tìm kiếm giải pháp hình ảnh khi tôi quen thuộc với nó, nhưng cuối cùng tôi đã đi với đề xuất của @ sam gifsicle
. Nó đã làm những gì tôi muốn, không có rắc rối.
Có thể tối ưu hóa kích thước tệp kết quả theo nhiều cách, nhưng tôi đã đi chỉ với việc giảm kích thước và giảm số lượng màu sắc. Làm việc như người ở:
gifsicle --resize 48x48 --colors 16 original.gif > smaller.gif
-coalesce
"tạo ra một cái nhìn hoàn chỉnh về hoạt hình ở mỗi điểm, giống như một dải phim thực sự, chứ không phải là một chuỗi hoạt hình. Một chuỗi như vậy, được gọi là Hoạt hình Coalesced dễ dàng hơn để nghiên cứu, chỉnh sửa, sửa đổi và tối ưu hóa lại."