bagaimana cara mengubah ukuran file GIF animasi menggunakan ImageMagick?


46

Saya ingin mengubah ukuran file GIF animasi do.gif masukkan deskripsi gambar di sini

Jika saya melakukannya convert do.gif -resize 24x24\! do-24.gifsaya mendapatkannya diubah ukurannya di do-24.gif tetapi tidak animasimasukkan deskripsi gambar di sini

Bagaimana mengubah ukurannya dengan cara yang benar untuk mendapatkan animasi yang sama?

Jawaban:


56

Lari pertama:

convert do.gif -coalesce temporary.gif

kemudian

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

2
-coalesce"Membuat tampilan lengkap animasi di setiap titik, sedikit seperti strip film sejati, daripada urutan animasi. Urutan seperti itu, yang dikenal sebagai Animasi Penggabungan jauh lebih mudah untuk dipelajari, diedit, dimodifikasi, dan dioptimalkan kembali."
sam

28
gifsicle --resize 24x24 > do-24.gifbisa untuk ini juga
sam

2
Perhatikan bahwa tampilan bersatu jauh lebih besar daripada yang dioptimalkan (3,2 kali dalam pengujian saya), dan mengubah ukuran menghasilkan gambar bersatu, yang juga bisa lebih besar dari ukuran file asli (2,3 kali dalam pengujian saya) bahkan jika resolusi lebih kecil. Ketika saya mencoba mengubah ukuran langsung itu terlihat baik-baik saja dan memiliki ukuran file kecil, meskipun mungkin itu hanya berfungsi untuk gambar ini.
endolith

1
gifsicle menghasilkan output yang jauh lebih baik, dioptimalkan untuk kasus penggunaan saya. Terima kasih @sam!
sj26

4
convert temporary.gif -ukuran 24x24 lebih kecil.gif bekerja untuk saya., tanpa menentukan ukuran input.
AMB

5

Saya sedang mencari solusi imagemagick karena saya sudah terbiasa dengan itu, tetapi pada akhirnya saya pergi dengan saran @ sam gifsicle. Itu melakukan apa yang saya inginkan, tidak ada kerumitan.

Dapat mengoptimalkan ukuran file yang dihasilkan dalam banyak cara, tapi saya pergi dengan hanya mengurangi ukuran dan mengurangi jumlah warna. Bekerja seperti pesona:

gifsicle --resize 48x48 --colors 16 original.gif > smaller.gif

3

-coalesce + -deconstruct

Setelah itu -coalesce, Anda mungkin ingin menambahkan -deconstruct:

convert in.gif -coalesce -resize 256x -deconstruct out-deconstruct.gif

Akar penyebab masalahnya adalah bahwa input GIF Anda diperkecil dengan benar: GIF memungkinkan frame berikutnya menjadi hanya persegi panjang yang dimodifikasi dari yang sebelumnya di offset.

-coalescekemudian perluas semua frame ke ukuran asli, yang membuat ukurannya berfungsi, tetapi itu tidak mengkompres ulang frame lagi seperti gambar input Anda: -deconstructdiperlukan untuk itu!

Menggunakan data uji dari jawaban ini: Bagaimana cara membuat animasi gif dari gambar foto (lebih disukai dengan baris perintah)? kita bisa melihat ini dengan jelas dengan 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

masukkan deskripsi gambar di sini

out-coalesce.gif

masukkan deskripsi gambar di sini

out-deconstruct.gif

masukkan deskripsi gambar di sini

Pertama, kita melihat cara memasukkan file,, out-convert.gifsebenarnya dikompresi, karena frame 2 hanya 516x516diimbangi 252+257, sedangkan frame 1 berukuran penuh adalah 1024x1024.

Lalu, jika kita membandingkan ketiga konversi:

  • out.gif: Semua frame 256x256atau lebih besar, dan besar sekitar 5MiB, TODO mengapa?

    Secara visual salah, karena kira-kira 256x256frame memiliki offset non-nol, misalnya 125+128untuk frame 2!

  • out-coalesce.gif: semua frame 256x256dan memiliki offset yang benar 0+0.

    Output terlihat benar secara visual, tetapi ukuran file output adalah 2,0 MiB, yang lebih besar dari out-deconstruct.gif

  • out-deconstruct.gif: frame terkompresi, ukuran keluaran akhir 1,9 MiB.

    Tidak jauh lebih kecil daripada out-coalesce.gif, tapi saya pikir ini hanya karena tanah hitam kompres dengan sangat baik, dan itu bisa sangat signifikan secara umum.

ffmpeg dan gifsicle

Saya juga mencoba perintah berikut:

ffmpeg -i out-convert.gif -vf scale=256:-1 out-ffmpeg-small.gif
gifsicle --resize 256x256 out-convert.gif > out-gifsicle.gif

dan keduanya menghasilkan output 1,5 MiB yang tampak lebih kecil dengan benar.

Lihat juga: Bagaimana cara membuat animasi gif dari gambar foto (lebih disukai dengan baris perintah)?

TODO: mengapa mereka membuatnya lebih kecil dari convert? Apakah mereka hanya memilih lebih baik persegi panjang diff minimal, atau sesuatu yang lain?

Diuji di Ubuntu 18.10, ffpmeg 4.0.2-2, ImageMagick 6.9.10-8.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.