Jawaban:
Lari pertama:
convert do.gif -coalesce temporary.gif
kemudian
convert -size <original size> temporary.gif -resize 24x24 smaller.gif
gifsicle --resize 24x24 > do-24.gif
bisa untuk ini juga
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
-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.
-coalesce
kemudian perluas semua frame ke ukuran asli, yang membuat ukurannya berfungsi, tetapi itu tidak mengkompres ulang frame lagi seperti gambar input Anda: -deconstruct
diperlukan 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
out-coalesce.gif
out-deconstruct.gif
Pertama, kita melihat cara memasukkan file,, out-convert.gif
sebenarnya dikompresi, karena frame 2 hanya 516x516
diimbangi 252+257
, sedangkan frame 1 berukuran penuh adalah 1024x1024
.
Lalu, jika kita membandingkan ketiga konversi:
out.gif
: Semua frame 256x256
atau lebih besar, dan besar sekitar 5MiB, TODO mengapa?
Secara visual salah, karena kira-kira 256x256
frame memiliki offset non-nol, misalnya 125+128
untuk frame 2!
out-coalesce.gif
: semua frame 256x256
dan 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.
-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."