#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()
функцию, и мы изменяем размер каждого кадра в соответствии с его первоначальным размером, поэтому у нас не возникает никаких проблем с прозрачностью кадра.