Làm cách nào để tạo gif hoạt hình từ ảnh tĩnh (tốt nhất là với dòng lệnh)?


78

Tôi muốn làm một .gifhình ảnh hoạt hình từ một bộ .jpghình ảnh nhất định.

Tôi muốn làm điều đó từ dòng lệnh, vì vậy các công cụ dòng lệnh sẽ rất được hoan nghênh.


Câu trả lời:


87

Bạn có thể sử dụng gói ImageMagick . Cài đặt nó bằng lệnh:

sudo apt-get install imagemagick

Bây giờ bạn có thể tạo giftừ một số hình ảnh ( jpg) bằng cách sử dụng:

convert -delay 20 -loop 0 *.jpg myimage.gif

6
Xin vui lòng, bao gồm ở đây cách bạn thay đổi kích thước hoạt hình gif, vv 50%. Vv -resize 50%.
Léo Léopold Hertz

Ubuntu 18.10 thất bại với "tài nguyên bộ nhớ cache kiệt sức" cho những hình ảnh này: github.com/cirosantilli/media/blob/master/... liên quan: superuser.com/questions/1178666/...
Ciro Santilli新疆改造中心法轮功六四事件

Người dùng ImageMagick có thể cũng sẽ muốn : -deconstruct. Tôi cũng đã phát hiện ra rằng ImageMagick rất đói bộ nhớ, xem điểm chuẩn: Askubfox.com/a/1102183/52975
Ciro Santilli 新疆

convert -delay 0 -loop 0 *.tif myanimated.gifhoạt động độc đáo, trên 720 tệp tif
ron

46

Để hoàn thành câu trả lời @Maythux:

Để tránh tạo một tệp rất lớn, bạn có thể sử dụng -resizetùy chọn:

Trong trường hợp của tôi, tôi có 4608x3456 hình ảnh và gif được tạo là hơn 300M cho 32 hình ảnh

convert -resize 20% -delay 20 -loop 0 *.jpg myimage.gif

hoặc là

convert -resize 768x576 -delay 20 -loop 0 *.jpg myimage.gif

Chăm sóc * .jpg

*.jpg hút một chút khi xử lý các giá trị số, bạn có thể tạo một gif với các bức ảnh chưa được sắp xếp.

$ ls|cat
21-33-26_1.jpg
21-33-26_10.jpg   // <--- this one
21-33-26_2.jpg
21-33-26_3.jpg
21-33-26_4.jpg
21-33-26_5.jpg
21-33-26_6.jpg
21-33-26_7.jpg
21-33-26_8.jpg
21-33-26_9.jpg
21-33-28_1.jpg    // <--- should be here    
21-33-28_2.jpg
21-33-28_3.jpg
...

Vì các bức ảnh được chụp rất nhanh (10 / s), tất cả chúng đều có cùng thời gian sửa đổi và bạn không thể sử dụng ls -tví dụ. Trên Ubuntu, bạn có thể sử dụng ls -vthay thế, đại loại như:

convert -resize 768x576 -delay 20 -loop 0 `ls -v` myimage.gif

Sắp xếp số lượng khá khó khăn trên Mac OS X, tôi đoán bạn sẽ cần xây dựng một tập lệnh tùy chỉnh.


4
Bạn có thể tránh sự cố * .jpg của mình bằng cách chuyển tiếp số đệm với số không. "01.jpg" thay vì "1.jpg", v.v. Nếu bạn nhận được ba chữ số, thì "001.jpg", "010.jpg", v.v.
bigreddmachine

2
Có một số cách xung quanh vấn đề trình tự tên tệp. Bao gồm find, sortmở rộng cú đúp, và như vậy. Công lscụ này nổi tiếng là không phù hợp với loại điều này. Sử dụng find. Có một chút đường cong học tập, nhưng nó đáng giá.
lên tiếng vào

Một số người dùng có thể quan tâm đến việc chỉnh sửa tên tệp bằng massren: github.com/laurent22/massren
Graham P Heath

phải mất nhiều năm để hoàn thành. Có một tùy chọn dài dòng?
ouranos

21

Tôi không đủ danh tiếng để bình luận nhưng thay vì sửa đổi tên tệp, bạn có thể sử dụng globalbing để lấy shell của mình để mở rộng tên tệp

convert -resize 50% -delay 10 -loop 0 image_{0..99}.jpg output.gif

11

GIMP

Bạn có thể dễ dàng làm điều này với GIMP. Trước tiên hãy cài đặt nó nếu nó chưa được cài đặt

sudo apt-get install gimp

Tạo gif

Từ GIMP, đi tới Tệp -> Mở dưới dạng Lớp để mở tất cả các png trên lớp của riêng họ.

Mở dưới dạng Layer

Từ đây, bạn có thể thực hiện các chỉnh sửa trên các lớp và sau khi hoàn tất, hãy chuyển đến Tệp -> Xuất dưới dạng . Từ hộp thoại, đảm bảo đặt loại tệp thành GIF.

Đặt loại tệp thành GIF

Từ đó bạn sẽ đi đến các tùy chọn xuất GIF. Chọn tùy chọn ' As Animation ' và đặt các tham số theo yêu cầu.

Tùy chọn xuất GIF


7

giải pháp ffmeg + dữ liệu thử nghiệm

Kể từ Ubuntu 18.10, ffpmeg 4.0.2-2, ImageMagick 6.9.10-8, tôi đã thấy rằng ffmpeg nhanh hơn nhiều và sử dụng ít bộ nhớ hơn .

Lệnh chuyển đổi đơn giản nhất là:

ffmpeg \
  -framerate 60 \
  -pattern_type glob \
  -i '*.png' \
  -r 15 \
  -vf scale=512:-1 \
  out.gif \
;

Bạn có thể lấy dữ liệu thử nghiệm của tôi với:

wget -O opengl-rotating-triangle.zip https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.zip?raw=true
unzip opengl-rotating-triangle.zip
cd opengl-rotating-triangle

Dữ liệu thử nghiệm được tạo với: https://stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file/14324292#14324292 và chứa 256 ảnh 1024x1024 PNG.

Và đây là một dữ liệu thử nghiệm khác mà bạn có thể tạo trực tiếp trong trình duyệt của mình ngay bây giờ! https://stackoverflow.com/questions/19235286/convert-html5-canvas- resultence-to-a-video-file / 57153718 # 57153718

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

Các ffmpegtùy chọn quan trọng tôi muốn nêu bật là:

  • -pattern_type glob: cách thuận tiện để chọn hình ảnh

  • -framerate 60: giả sử 60 FPS trên các hình ảnh đầu vào và xuất ra cùng một FPS.

    ffmpeg không thể biết khác, vì không có dữ liệu FPS trong hình ảnh vì có định dạng video.

    256 khung hình đầu vào mất khoảng 4 giây để hoàn thành.

    -r 15: không bắt buộc. Chọn một trong 4 hình ảnh để giảm kích thước ( 4 == 60 / 15).

    Với nó, identify out.gifnói rằng GIF chỉ chứa 64 khung hình.

    Nó vẫn mất 4 giây để chơi, vì vậy độ trễ được thay đổi để làm cho mọi thứ khớp.

  • -vf scale=512:-1: không bắt buộc. Đặt chiều rộng, tỷ lệ chiều cao theo tỷ lệ, thường để giảm kích thước và tiết kiệm không gian.

Để ImageMagick hoạt động, trước tiên tôi phải sửa đổi giới hạn ổ đĩa và bộ nhớ của nó /etc/ImageMagick-6/policy.xmlnhư được giải thích tại: https://superuser.com/questions/1178666/imagemagick-convert-quits-after-some-pages

Xem thêm:

Điểm chuẩn của ImageMagick vs ffmpeg

Tôi đã so sánh các lệnh:

/usr/bin/time -v convert *.png -deconstruct -delay 1.6 out-convert.gif
/usr/bin/time -v ffmpeg \
  -framerate 60 \
  -pattern_type glob \
  -i '*.png' \
  out-ffmpeg.gif \
;

Các lệnh được xây dựng để tạo ra các đầu ra càng gần càng tốt để làm cho phép so sánh hợp lệ:

  • /usr/bin/time -v: được sử dụng để tìm mức sử dụng bộ nhớ tối đa như được giải thích tại: https://stackoverflow.com/questions/774556/peak-memory-usage-of-a-linux-unix- process

  • -deconstruct: Ảnh GIF chỉ có thể chứa hình chữ nhật được sửa đổi tối thiểu từ khung trước để làm cho GIF nhỏ hơn.

    ffmpegtính toán các khác biệt theo mặc định, nhưng ImageMagick thì không, trừ khi -deconstructđược sử dụng.

    Về cơ bản, bạn sẽ muốn sử dụng tùy chọn đó mỗi lần với ImageMagick.

    Chúng ta có thể quan sát sự khác biệt với:

    identify out.gif
    

    Với phiên bản nén, tất cả các khung có kích thước nhỏ hơn kích thước ban đầu, ví dụ:

    out.gif[0] GIF 1024x1024 1024x1024+0+0 8-bit sRGB 256c 16.7865MiB 0.010u 0:00.010
    out.gif[1] GIF 516x516 1024x1024+252+257 8-bit sRGB 256c 16.7865MiB 0.010u 0:00.010
    out.gif[2] GIF 515x520 1024x1024+248+257 8-bit sRGB 256c 16.7865MiB 0.010u 0:00.010
    

    Trong ví dụ này, khung thứ hai chỉ 516x516thay vì 1024x1024 đầy đủ và được đặt ở vị trí bù 252+257. Do đó, nó chỉ chứa tam giác giữa.

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

  • -delay: giá trị khớp với 60FPS của ffmpeg. Không quan trọng đối với hiệu suất chuyển đổi, nhưng tôi không muốn mạo hiểm.

Các GIF đầu ra có cùng kích thước và trông giống hệt nhau.

Chúng tôi nhận được cho ImageMagick:

Elapsed (wall clock) time (h:mm:ss or m:ss): 0:56.16
Maximum resident set size (kbytes): 2676856

và cho ffmpeg:

Elapsed (wall clock) time (h:mm:ss or m:ss): 0:04.41
Maximum resident set size (kbytes): 97172

từ đó chúng ta thấy rằng:

  • ImageMagick sử dụng 2,6Gb RAM và mất khoảng 1 phút
  • ffmpeg đã sử dụng 100Mb RAM và mất 4 giây

Kiểm tra phần cứng: máy tính xách tay Lenovo ThinkPad P51 , Intel Core i7-7820HQ, 32GB (16 + 16) DDR4 2400 MHz SODIMM, 512GB SSD PCIe TLC OPAL2.


Nâng cao và thích!, Câu trả lời tuyệt vời, tôi có một câu hỏi tiếp theo nhỏ. Tôi không có nhiều hình ảnh chất lượng cao, và tôi không sử dụng -r -vra lệnh, vẫn gif đầu ra có chất lượng thấp hơn nhiều so với các tệp png gốc. Làm thế nào để giữ chất lượng gif như các tệp png đã cho?
astro123

Hi @ astro123 chất lượng thấp hơn như thế nào? Kích thước hình ảnh nhỏ hơn, hoặc ít khung hình hơn hoặc thứ gì khác (GIF sử dụng lossless rõ ràng, vì vậy không thể nén tệ hơn)? Hãy thử -framerate 60 -r 60. Kiểm tra GIF được tạo và nhập hình ảnh bằng các công cụ ImageMagick identifyđể thử và tìm hiểu điều gì đang xảy ra.
Ciro Santilli 心 心

4

Bạn có thể sử dụng một chương trình có tên là convert được bao gồm trong gói hình ảnh. Nó là dòng lệnh điều khiển, nhưng rất dễ sử dụng. Cài đặt nó thông qua trung tâm phần mềm hoặc đi đến dấu nhắc lệnh và nhập

sudo apt-get install imagemagick

Bây giờ để tạo .gif.

convert -delay 100  -size 100x100 xc:SkyBlue \
          -page +5+10  balloon.gif   -page +35+30 medical.gif  \
          -page +62+50 present.gif   -page +10+55 shading.gif  \
          -loop 0  animation.gif

* Lưu ý ví dụ trên là trực tiếp từ ví dụ về Image Magick


1
Làm cách nào để thực hiện 40 hình ảnh PNG trong GIF lặp? Tất cả trong thư mục / nhà / fusion809 / Tài liệu / Hình ảnh
BH2017

1
@ BH2017: convert -delay 20 -loop 0 *.png out.giftạo một vòng lặp GIF.
unutbu
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.