Пакет animate великолепен, но может ли он обеспечить лучшее сжатие анимации?

Пакет animate великолепен, но может ли он обеспечить лучшее сжатие анимации?

Я только что попробовал этот animateпакет для получения PDF-файлов с анимацией, и он отлично работает!

Однако я заметил, что размер сгенерированных файлов в 10 раз больше, чем мог бы быть для анимаций, с которыми я имею дело, а в большинстве случаев все даже хуже.

Я считаю, что причина в том, что не используется разница между последовательными кадрами вместо полного кадра для каждого кадра. Это, например, то, что использует gifsiclehttp://www.lcdf.org/gifsicle/ (источник доступен) «Сохраняет только измененную часть каждого кадра и может радикально сжимать ваши GIF-файлы».

Есть ли шанс, что это можно оптимизировать в animateпакете?

решение1

Вы можете оптимизировать размер PDF-анимации, используя дифференциальные растровые изображения и timelineфункцию пакета animate.

Однако следует отметить, что с каждым новым кадром анимации, который нужно отобразить, количество дифференциальных кадров, которые необходимо отобразить повторно, увеличивается на один. Это может замедлить запущенную анимацию с течением времени. Adobe Reader изначально не был оптимизирован для скорости графического рендеринга. Поэтому для длинных последовательностей битовых изображений может быть лучше создать видеофайл (MP4/H.264) и встроить его в пакет media9.

Если вы все же хотите анимировать дифференциальные последовательности растровых изображений, выполните следующие действия:

(1) Создайте оптимизированную по размеру версию исходного анимированного GIF-изображения, используя gifsicle:

gifsicle -O3 animated.gif > optimized.gif

Для тестирования вы можете попробовать этот анимированный gif-файл с сайта asymptote:http://asymptote.sourceforge.net/gallery/animations/wheel.gif

(2) Создайте последовательность PNG ( difference-0.png, difference-1.png, ...) различий изображений, используя скрипт, ungif.shуказанный ниже. Скрипт записывает временную шкалу, которая будет использоваться, в \animategraphicsстандартный вывод, который перенаправляется в текстовый файл timeline.txt:

ungif.sh optimized.gif difference.png > timeline.txt

(3) PDF-файл с анимированной последовательностью можно создать из следующего исходного файла LaTeX (максимальное количество кадров и, возможно, частоту кадров необходимо будет скорректировать):

\documentclass{article}
\usepackage{animate}

\begin{document}

\noindent\animategraphics[
  controls,
  width=0.5\linewidth,
  timeline=timeline.txt
]{10}{difference-}{0}{99} %adjust the maximum frame number

\end{document}

(4) Перед просмотром анимации в Adobe Reader убедитесь, что в настройках Reader (Edit->Preferences->Page Display) не отмечена галочка «Сглаживание изображений». В противном случае вы получите некрасивые артефакты.

Содержимое скрипта Bash ungif.sh(требуется ImageMagick):

#!/bin/bash

wxh=$(identify -format '%Wx%H' $1[0])
fs=$(identify -format %n $1)

for (( i=0; i<$fs; i++ ))
do
  convert -page $wxh ${1}[$i] -matte -background none -layers coalesce -quality 90 ${2/./-$i.}
  echo "::${i}x0"
done

Связанный контент