Làm cách nào để thay đổi kích thước tệp GIF động bằng ImageMagick?


46

Tôi muốn thay đổi kích thước tệp GIF hoạt hình như vậy do.gif nhập mô tả hình ảnh ở đây

Nếu tôi làm, convert do.gif -resize 24x24\! do-24.giftôi sẽ thay đổi kích thước trong do-24.gif nhưng không hoạt hìnhnhập mô tả hình ảnh ở đây

Làm thế nào để thay đổi kích thước nó đúng cách để có được hình ảnh động tương tự?

Câu trả lời:


56

lần chạy đầu tiên:

convert do.gif -coalesce temporary.gif

sau đó

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

2
-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."
sam

28
gifsicle --resize 24x24 > do-24.gifcũng có thể như vậy
sam

2
Lưu ý rằng chế độ xem kết hợp lớn hơn nhiều so với chế độ xem được tối ưu hóa (3,2 lần trong thử nghiệm của tôi) và thay đổi kích thước tạo ra hình ảnh kết hợp, cũng có thể lớn hơn kích thước tệp gốc (2,3 lần trong thử nghiệm của tôi) ngay cả khi độ phân giải nhỏ hơn. Khi tôi thử thay đổi kích thước trực tiếp, nó trông ổn và có kích thước tệp nhỏ, mặc dù có thể nó chỉ hoạt động cho hình ảnh này.
endolith

1
gifsicle tạo ra một đầu ra tối ưu hóa tốt hơn nhiều cho trường hợp sử dụng của tôi. Cảm ơn @sam!
sj26

4
chuyển đổi tạm thời.gif -resize 24x24 small.gif hoạt động với tôi., mà không chỉ định kích thước đầu vào.
AMB

3

-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ù.

-coalescesau đó 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: -deconstructlà 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

nhập mô tả hình ảnh ở đây

ra-coalesce.gif

nhập mô tả hình ảnh ở đây

out-deconstruct.gif

nhập mô tả hình ảnh ở đây

Đầu tiên, chúng ta thấy cách nhập tệp, out-convert.giftrê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 256x256lớ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 256x256khung xấp xỉ đó có độ lệch khác không, ví dụ 125+128cho khung 2!

  • out-coalesce.gif: tất cả các khung đều có 256x256và 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.


3

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.