Существует проблема с GifSequenceWriter
при использовании изображений палитры (BufferedImage.TYPE_BYTE_INDEXED
с IndexColorModel
). Это создаст метаданные на основе стандартной 216 цветовой палитры ( веб-безопасная палитра ), которая явно отличается от цветов в вашем изображении.
Проблемные строки в GifSequenceWriter
:
ImageTypeSpecifier imageTypeSpecifier = ImageTypeSpecifier.createFromBufferedImageType(imageType);
imageMetaData = gifWriter.getDefaultImageMetadata(imageTypeSpecifier, imageWriteParam);
Вместо этого метаданные должны основываться на цветовой палитре в индексной цветовой модели вашего изображения. Но хорошая новость в том, что без нее все работает нормально.
Вы можете просто использовать:
GifSequenceWriter writer = new GifSequenceWriter(output, BufferedImage.TYPE_INT_ARGB, delayTimeMS, true);
... и автор автоматически создаст палитру по мере необходимости из ваших фактических данных изображения.
Также возможно исправить GifSequenceWriter
, чтобы принять ImageTypeSpecifier
вместо int imageType
, однако, это будет работать, только если все кадры используют одну и ту же палитру, я думаю:
public GifSequenceWriter(
ImageOutputStream outputStream,
ImageTypeSpecifier imageTypeSpecifier,
int timeBetweenFramesMS,
boolean loopContinuously) throws IIOException, IOException {
// my method to create a writer
gifWriter = getWriter();
imageWriteParam = gifWriter.getDefaultWriteParam();
imageMetaData = gifWriter.getDefaultImageMetadata(imageTypeSpecifier, imageWriteParam);
// ... rest of the method unchanged.
Использование:
ColorModel cm = firstImage.getColorModel();
ImageTypeSpecifier imageType = new ImageTypeSpecifier(cm, cm.createCompatibleSampleModel(1, 1));
GifSequenceWriter writer = new GifSequenceWriter(output, imageType, delayTimeMS, true);