Изменение размера анимированного GIF с помощью GraphicsMagick

#c #linux #image-processing #imagemagick #image-manipulation

#c #linux #обработка изображений #imagemagick #манипулирование изображениями

Вопрос:

У меня есть анимированное gif изображение с прозрачными рамками. Мне нужно изменить его размер.

Перед изменением размера я использую Magick::coalesceImages функцию, после изменения размера изображения я использую Magick::writeImages функцию для сбора всех gif кадров обратно в одно изображение.

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

Я читал об оптимизации кадров на www.imagemagick.org плюс я вижу на www.graphicsmagick.org gifDisposeMethod функция.

Мой вопрос в том, как я могу заставить измененное анимированное gif изображение использовать рамки прозрачности и избежать увеличения KBytes размера изображения?

Комментарии:

1. спасибо за исправление моих грамматических ошибок, но мне действительно не помешал бы ответ…

2. Можно было бы ожидать, что он будет больше, если вы увеличите размер кадров — в чем разница в ширине / высоте пикселя и в чем разница в КБ файла?

3. ну, исходное изображение имеет размер 230X40 10 896 байт. после использования Magick::coalesceImage и изменения размера изображения до 213X37 я получаю 108 207 байт изображения. я вижу, что как только я изменяю размер изображения до 92% от его исходного размера, не используя coalesceImage (поскольку я использую проценты, размер каждого кадра будет соответствовать его исходным размерам, поэтому я решил, что могу убрать использование coalesceImage), я получаю изображение намного меньшего размера — 15 226 Байт, которое все еще больше, чем исходное изображение. и я действительно не могу понять, как получилось, что я получил изображение большего размера

Ответ №1:

Что ж, я нашел способ:

При изменении размера анимированного файла gif использование Magick::coalesceImages() не самый лучший способ…

Вместо этого я изменяю размер в соответствии с процентным размером, а не абсолютным размером, пропуская Magick::coalesceImages() вызов.

Допустим, мой исходный анимированный файл gif имеет размер 300×300, и я хочу изменить его размер до 150×150, я сделаю следующее:

  • Прочитайте изображение в Magick::Blob
  • Вычислите процентные значения (50% x50% в моем демонстрационном примере)
  • Измените размер каждого кадра изображения в соответствии с процентными расчетами.

Таким образом, мы не увеличиваем размер каждого кадра, потому что мы не используем Magick::coalesceImages() функцию, и мы изменяем размер каждого кадра в соответствии с его первоначальным размером, поэтому у нас не возникает никаких проблем с прозрачностью кадра.