Поддерживает ли Java ImageIO (или любые другие обработчики изображений) формат изображения BI_RLE8? Единственное, что мне удалось найти, это BMPImageWriteParam, но я понятия не имею, как это использовать. Любая помощь будет замечательной.
См. Этот пример, как писать с использованием ImageWriter
и с помощью ImageWriteParam
(используйте экземпляр BMPImageWriteParam
в вашем случае). Прокрутите немного вниз, чтобы найти пример записи.
Вместо строки:
ImageWriteParam param = writer.getDefaultWriteParam();
Вы должны вставить что-то вроде:
BMPImageWriteParam param = new BMPImageWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionType("BI_RLE8");
Вы можете безопасно передать null
для миниатюр и метаданных (...
в примере).
Если вы хотите сохранить изображение с помощью настраиваемых параметров, вам необходимо использовать ImageWriter
с помощью которого вы можете передавать пользовательские параметры для записи выходного файла.
Вы можете получить параметры из ImageWriter
используя метод getDefaultWriteParam()
где вы можете установить тип сжатия. Вам даже не нужно BMPImageWriteParam
его в BMPImageWriteParam
поскольку настройка типа сжатия доступна через ImageWriter
.
Обратите внимание, что для использования пользовательского типа сжатия вам необходимо установить режим сжатия в ImageWriteParam.MODE_EXPLICIT
.
Вот полный код:
BufferedImage bi = new BufferedImage(200, 100, BufferedImage.TYPE_BYTE_INDEXED);
ImageWriter writer = ImageIO.getImageWritersByFormatName("bmp").next();
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionType("BI_RLE8");
writer.setOutput(new FileImageOutputStream(new File("test.bmp")));
writer.write(null, new IIOImage(bi, null, null), param);
writer.dispose();
Обратите внимание, что сжатие BI_RLE8
недоступно для всех типов BufferedImage
s.
Для exmaple BI_RLE8
сжатие поддерживается для BufferedImage.TYPE_BYTE_INDEXED
и BufferedImage.TYPE_BYTE_GRAY
но оно не поддерживается для BufferedImage.TYPE_3BYTE_BGR
в этом случае метод IOException
будет вызываться методом ImageWriter.write()
(который фактически является BMPImageWriter.write()
).
setCompressionType()
с нужным вам типом. Все 4 перечисленных типа поддерживаются, как указано в документации