ImageMagick'i kullanarak bir animasyonlu GIF dosyasını nasıl yeniden boyutlandırabilirim?


46

Böyle bir animasyonlu GIF dosyasını do.gif olarak yeniden boyutlandırmak istiyorum görüntü tanımını buraya girin

Bunu yaparsam do -24.gifconvert do.gif -resize 24x24\! do-24.gif içinde yeniden boyutlandırılırım ancak animasyonlu olmazgörüntü tanımını buraya girin

Aynı animasyonu elde etmek için doğru şekilde nasıl yeniden boyutlandırılır?

Yanıtlar:


56

ilk çalıştırma:

convert do.gif -coalesce temporary.gif

sonra

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

2
-coalesce"Her noktada, bir animasyon dizisinden ziyade, gerçek bir film şeridi gibi, tam bir görünüm oluşturur. Birleştirilmiş Animasyon olarak bilinen böyle bir dizinin incelenmesi, düzenlenmesi, değiştirilmesi ve yeniden optimize edilmesi çok daha kolaydır."
Sam

28
gifsicle --resize 24x24 > do-24.gifbu da olabilir
sam

2
Birleştirilmiş görünümün, optimize edilmiş görünümden (testimde 3.2 kez) çok daha büyük olduğuna ve yeniden boyutlandırmanın, çözünürlükte olsa bile dosya boyutunda (testimde 2.3 kez) orijinal olandan da daha büyük olabilen birleşik bir görüntü ürettiğine dikkat edin. daha küçük. Doğrudan yeniden boyutlandırmayı denediğimde gayet iyi görünüyor ve küçük bir dosya boyutuna sahip olsa da, belki de bu görüntü için işe yarar.
Endolit

1
gifsicle, kullanım durumum için çok daha iyi ve optimize bir çıktı üretti. @Sam teşekkürler!
sj26

4
temporary.gif -resize 24x24 smaller.gif benim için çalışır. Giriş boyutunu belirtmeden.
AMB

3

-coalesce + -deconstruct

Sonra -coalesce, muhtemelen aşağıdakileri eklemek istersiniz -deconstruct:

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

Sorunun kök nedeni, GIF girişinizin uygun şekilde en aza indirilmiş olmasıdır: GIF, bir sonraki karenin ofsetteki bir önceki karenin sadece değiştirilmiş bir dikdörtgen olmasına izin verir.

-coalescedaha sonra tüm çerçeveleri orijinal boyutuna genişletir, bu da yeniden boyutlandırmanın çalışmasını sağlar, ancak çerçeveleri yeniden giriş resminiz olarak yeniden sıkıştırmaz: -deconstructbunun için gereklidir!

Bu cevaptaki test verilerini kullanarak: Hareketsiz görüntülerden nasıl hareketli bir gif oluşturabilirim (tercihen komut satırında)? Bunu açıkça görebiliyoruz 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

görüntü tanımını buraya girin

out-coalesce.gif

görüntü tanımını buraya girin

out-deconstruct.gif

görüntü tanımını buraya girin

İlk olarak, dosyanın nasıl girileceğini görüyoruz out-convert.gif, gerçekte sıkıştırılmış, çünkü kare 2 sadece 516x516ofsette 252+257iken, tam boyutlu kare 1 ise 1024x1024.

Ardından, üç dönüşümü karşılaştırırsak:

  • out.gif: Tüm kareler büyük 256x256veya daha büyük ve yaklaşık 5MiB büyük, TODO neden?

    Görsel olarak yanlış, çünkü yaklaşık 256x256kareler sıfır olmayan bir kaymaya sahip, örneğin 125+128kare 2!

  • out-coalesce.gif: tüm çerçeveler 256x256doğru ve doğru ofset 0+0.

    Çıktı görsel olarak doğru gözüküyor, ancak çıktı dosya boyutu 2.0 MiB out-deconstruct.gif

  • out-deconstruct.gif: sıkıştırılmış çerçeveler, son çıktı boyutu 1.9 MiB.

    Çok daha küçük değil out-coalesce.gif, ama bence bu sadece siyah zeminin çok iyi sıkıştığı ve genel olarak çok önemli olabileceği içindir.

ffmpeg ve gifsicle

Ayrıca aşağıdaki komutları da denedim:

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

ve her ikisi de, daha küçük, doğru görünen bir 1,5 MiB çıkış üretti.

Ayrıca bakınız: Hareketsiz görüntülerden nasıl animasyonlu bir gif oluşturabilirim (tercihen komut satırıyla)?

TODO: Neden daha küçük hale getirebilirler convert? Onlar sadece daha iyi daha az farksal dikdörtgenler mi seçiyorlar?

Ubuntu 18.10, ffpmeg 4.0.2-2, ImageMagick 6.9.10-8'de test edilmiştir.


3

Bildiğim kadarıyla imagemagick çözümü arıyordum, ama sonunda @ sam'ın önerisine gittim gifsicle. Tam istediğimi yaptım, güçlük yok.

Elde edilen dosya boyutunu birçok yönden optimize edebilir, ancak ben sadece boyutunu küçülterek ve renk sayısını azaltarak gittim. Bir cazibe gibi çalıştı:

gifsicle --resize 48x48 --colors 16 original.gif > smaller.gif
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.