Tại sao gif tôi tạo ra rất chậm?


33

Tôi đang sử dụng ImageMagick để biến một bộ sưu tập pngs thành một gif duy nhất. Tôi muốn gif này lặp càng nhanh càng tốt.

Đây là xấp xỉ đầu ra mà tôi mong đợi (lịch sự của Wikipedia ):

sản lượng dự kiến

Đây là đầu ra tôi thực sự nhận được:

sản lượng thực tế

Trên trình duyệt của tôi (Firefox 17), gif dự kiến ​​sẽ chạy nhanh hơn gấp đôi so với gif thực tế. Điều này làm tôi ngạc nhiên, vì tôi đã chỉ định rằng mỗi khung hình nên có độ trễ 0.

Đầu tiên tôi tạo ra 36 png bằng cách phát nổ gif mượn từ Wikipedia:

--caution: command generates 36 pngs
convert.exe newton.gif newton_%d.png

Sau đó, tôi đã sử dụng coalesceđể kết hợp lại các pngs thành một gif.

convert.exe -dispose none -delay 0 newton_%d.png[0-35] -coalesce output.gif

identify xác nhận rằng mỗi khung hình không có độ trễ:

identify.exe -format "%T, " output.gif
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

Trên thực tế, điều này ít chậm trễ hơn bản gốc:

identify.exe -format "%T, " newton.gif
5, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2,

Gif thực tế có độ trễ ít hơn gif dự kiến. Vậy tại sao gif dự kiến ​​lại nhanh gấp đôi gif thực tế?


1
Vì tò mò, điều gì xảy ra nếu bạn đặt độ trễ thành 1 thay vì 0?
mgilson

1
trông giống như một vấn đề tốc độ khung hình.
SnakeDoc

@mgilson, mình mới thử mà. Hình ảnh độ trễ 0 và hình ảnh độ trễ 1 dường như được đồng bộ hóa hoàn hảo. Điều này thật kỳ lạ, vì hình ảnh 1 độ trễ sẽ bị tụt lại sau 36/100 giây trong mỗi giây.
Kevin

1
tl; dr về câu hỏi này: Sử dụng-delay 2 .
Matt M.

Câu trả lời:


17

Tôi đã thử nghiệm và tạo phiên bản 10ms (delay = 1).

Ví dụ độ trễ 10ms

Có vẻ như các chương trình kết xuất gifs có xu hướng không tôn vinh 0 phần trăm của tỷ lệ chậm trễ thứ hai. Thay vào đó, họ sử dụng một giá trị lớn hơn nhiều so với giá trị nhỏ mà bạn đã chọn.

Tôi thực sự không thể nhận xét về lý do tại sao họ làm điều này. Tôi đã bắt gặp nhiều hơn một lý do, và có thể đó là tất cả suy đoán.

Nói chung, tôi khuyên bạn nên sử dụng độ trễ ít nhất hai trăm giây trong mọi trường hợp.

Các nguồn (cho thấy dường như có nhiều lý do cho việc này. Một số tương đối cũ):


1
Nếu chương trình kết xuất làm chậm tất cả các gif quá nhanh, thì gif của Wikipedia sẽ chậm như gif của chính tôi. Nhưng nó không phải là. Tại sao Wikipedia có thể phá vỡ giới hạn tốc độ, còn tôi thì không?
Kevin

2
@Kevin: Nó làm chậm tất cả các GIF quá nhanh. GIF của bạn quá nhanh. GIF của Wikipedia không quá nhanh. Bạn cần chậm lại để không bị "quá nhanh".
David Schwartz

Độ trễ khung cho phạm vi gif Wikipedia trong khoảng từ 20 ms đến 50 ms. Nếu tôi đặt độ trễ khung hình của riêng mình thành 20 ms, nó vẫn chậm hơn, mặc dù về mặt lý thuyết, nó đáp ứng các tiêu chí "không quá nhanh" như gif Wikipedia.
Kevin

2
Nếu, bên cạnh hình ảnh wikipedia có độ trễ 20ms, bạn bao gồm một gif mà bạn đã tạo cũng có độ trễ 20ms, tôi sẽ xem xét.
David Mah

2
Tôi đã lầm. Các 20 ms gif Tôi tạo ra thực sự là nhanh như gif Wikipedia.
Kevin

18

Có vẻ như @DavidMah đã đúng. Trên hệ thống Linux của tôi, độ trễ tối thiểu là 0,5:

convert -dispose none -delay 0.4 newton_%d.png[0-35] -coalesce output0.4.gif

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

convert -dispose none -delay 0.5 newton_%d.png[0-35] -coalesce output0.5.gif

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

convert -dispose none -delay 1 newton_%d.png[0-35] -coalesce output1.gif

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

Vì một số lý do, hình ảnh dường như không được hiển thị đúng trong trình duyệt của tôi. Sử dụng trình xem hình ảnh cục bộ ( eom), hình ảnh thứ 1 chậm như hình ảnh trong câu hỏi ban đầu và cả hai hình ảnh khác đều nhanh hơn so với wikipedia. Tôi vẫn đăng bài trong trường hợp đó là một vấn đề cụ thể đối với trình duyệt của tôi. Trong mọi trường hợp, bạn sẽ nhận được tốc độ tốt hơn nếu bạn thử các lệnh được đăng ở trên.


CẬP NHẬT: Dường như có 2 vấn đề. Các trình duyệt (ít nhất là y firefox và crom chạy trên Linux) không thể hiển thị gifs được tạo với độ trễ <1.5. 1,5 hoạt động tốt, 1,4 là chậm. Trình xem hình ảnh của tôi có thể xử lý độ trễ từ 0,5 trở lên. Hãy thử tải xuống một trong những hình ảnh trên và mở nó trong trình xem hình ảnh yêu thích của bạn. Ngoài ra, hãy xem những điều sau:

convert -dispose none -delay 1.4 newton_%d.png[0-35] -coalesce output1.4.gif

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

convert -dispose none -delay 1.5 newton_%d.png[0-35] -coalesce output1.5.gif

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

CẬP NHẬT2: @DavidMah chỉ ra trong các bình luận bên dưới rằng các giá trị thập phân được làm tròn đến số nguyên gần nhất. Vì vậy, 1.4 được làm tròn thành 1 quá chậm trong khi 1.5 được làm tròn thành 2 là OK.


7
Coi chừng cố gắng gán độ trễ cho các giá trị thập phân. Độ trễ được lưu trữ trong hai byte (hàm ý của điều này là độ trễ khung lớn nhất là 655360ms) và là một số nguyên không dấu. Convert đang làm tròn các giá trị của bạn thành số nguyên gần nhất. vi.wikipedia.org/wiki/Graphics_Interchange_Format#Animated_GIF
David Mah

3
@DavidMah ah, điều đó có ý nghĩa. Vì vậy, 1,5 hoạt động vì nó được làm tròn thành 2 trong khi 1,4 không hoạt động vì nó được làm tròn thành 1.
terdon 22/03/13

6

Tôi đã thành công hơn khi sử dụng XxYký hiệu trễ, về cơ bản xgiống như một /, vì vậy nếu bạn chỉ định -delay 1x20, khung được hiển thị trong 1/20 giây.

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.