Я использую javax.imageio API и JAI для сжатия различных типов изображений. Он отлично работает для JPEG с использованием JPEGImageWriter
и GIF с использованием GIFImageWriter
. Но он не поддерживает сжатие PNG с использованием PNGImageWriter
, которое выдает исключение, например, тип сжатия не установлен или «Нет допустимого сжатия» и т. д. Поэтому я использовал это ниже ImageWriter
для PNG. Работает, но качество изображения очень плохое.
Кто-нибудь может подсказать, как использовать PNGImageWriter
для сжатия PNG и какой JAR его содержит?
File input = new File("test.png");
InputStream is = new FileInputStream(input);
BufferedImage image = ImageIO.read(is);
File compressedImageFile = new File(input.getName());
OutputStream os =new FileOutputStream(compressedImageFile);
Iterator<ImageWriter>writers =
ImageIO.getImageWritersByFormatName("jpg"); // here "png" does not work
ImageWriter writer = (ImageWriter) writers.next();
ImageOutputStream ios = ImageIO.createImageOutputStream(os);
writer.setOutput(ios);
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(0.5f);
writer.write(null, new IIOImage(image, null, null), param);