2009-04-22 2 views
22

Неужели кому-то удалось убедить ImageIO написать анимированный GIF и, в частности, установить правильные метаданные? Моя первая попытка примерно следующим образом (где b1 и b2 BufferedImages):Создание анимированного GIF с ImageIO?

ImageTypeSpecifier spec = new ImageTypeSpecifier(b1); 
ImageWriter wr = ImageIO.getImageWriters(spec, "GIF").next(); 
wr.setOutput(ImageIO.createImageOutputStream(new File("C:\\Flashing.gif"))); 
ImageWriteParam param = wr.getDefaultWriteParam(); 
IIOMetadata meta = wr.getDefaultImageMetadata(spec, param); 
wr.prepareWriteSequence(meta); 
wr.writeToSequence(new IIOImage(b1, null, null), param); 
wr.writeToSequence(new IIOImage(b2, null, null), param); 

Это, кажется, почти работа, но:

  • я явно нужно каким-то образом установить «правильный» метаданные, чтобы установить время между изображениями и идеально сделать их петлями (я наивно надеялся, что дефолт сделает что-то разумное, но hey ...)
  • любые метаданные, которые он пишет по умолчанию, явно не совсем прав: GIMP дает пару ошибок сообщения при загрузке файла, хотя вложение изображения на тестовую веб-страницу в Firefox показывает отображение tw O изображения в очень быстрой последовательности, которая tantilisingly близко к тому, что я хочу ...

Если кто-то получил писать анимированные GIF-файлы из ImageIO работать и может поделиться фрагмент рабочего кода или как исправить вышеуказанные проблемы , было бы весьма полезно!

ответ

29

Я столкнулся с этим вопросом и решил попробовать его; Требуется небольшая, но нетривиальная сумма, чтобы создать полезный класс (спасибо ax) - поэтому я думал, что могу поделиться кодом: here - это небольшой класс для создания анимированного gif-изображения из ряда других изображений.

+1

В примере, представленном в функции main(), есть ошибка. Комментарии скажут: '// последовательность gif с типом первого изображения, 1 секунда между кадрами, которая непрерывно петляет', что будет« новым GifSequenceWriter (output, firstImage.getType(), 1000, true) »вместо 'new GifSequenceWriter (output, firstImage.getType(), 1, false)' – gvlasov

+3

Кроме того, если вы обнаружите, что прозрачные цвета не обрабатываются должным образом (когда вы пишете прозрачный цвет, пиксель из предыдущего кадра сохраняет себя), вам нужно для этого: найдите строку с 'graphicsControlExtensionNode.setAttribute (" disposMethod "," none ");' и измените '' none "' на '" restoreToBackgroundColor "' – gvlasov

+0

Ваш код по-прежнему ссылается на stackoverflow [4 года спустя] (http://stackoverflow.com/questions/16649620/is-there-a-way-to-create-one-gif-image-from-multiple-images-in-java), и я планирую использовать его 7 лет спустя:) – Aaron

Смежные вопросы