Подтвердить что ты не робот

Создание анимированного GIF с помощью ImageIO?

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

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);

Это похоже почти на работу, но:

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

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

4b9b3361

Ответ 1

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