Java 如何在不改变大小的情况下压缩png图像

Java 如何在不改变大小的情况下压缩png图像,java,Java,我需要压缩png图像,但当我尝试这样做时,我会得到一个更大尺寸的新png图像。我的代码如下所示: public static BufferedImage compress(final BufferedImage originalImg, final int ratio, final String extension) { BufferedImage img = null; if (originalImg != null && ratio >

我需要压缩png图像,但当我尝试这样做时,我会得到一个更大尺寸的新png图像。我的代码如下所示:

public static BufferedImage compress(final BufferedImage originalImg, final int ratio, final String extension) {
        BufferedImage img = null;

        if (originalImg != null && ratio > 0) {
            final ImageWriter writer = ImageIO.getImageWritersByFormatName(extension).next();
            final ImageWriteParam writeParam = writer.getDefaultWriteParam();
            try {
                if (writeParam.canWriteCompressed()) {
                    writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
                    writeParam.setCompressionQuality(ratio / 100f);
                    final ByteArrayOutputStream output = new ByteArrayOutputStream();
                    final ImageOutputStream outputStream = ImageIO.createImageOutputStream(output);
                    writer.setOutput(outputStream);
                    writer.write(null, new IIOImage(originalImg, null, null), writeParam);
                    output.close();
                    outputStream.close();

                    ByteArrayInputStream is = new ByteArrayInputStream(output.toByteArray());
                    img = ImageIO.read(is);
                } else {
                    img = originalImg;
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                writer.dispose();
            }
        }
        return img;
    }
我得到这个图像,它的大小是49kb,但结果是420kb


我错在哪里?

您不是在压缩PNG,而是在将JPG转换为PNG。JPG更适合这种带有颜色梯度等的照片(-ish)图像,因此它比PNG小,即使后者被压缩。@tobias_k我正试图压缩
PNG
图像,但我无法上传它。你能给我一些关于如何压缩png图像的建议吗
ImageIO
library不适合我。@约翰:PNG是一种无损格式。它永远不会为这些类型的图像生成一个小文件大小(带颜色渐变的照片)。它最适合于简单的线条艺术风格的图像。JPEG更适合于带有照片的图片,但有损(即,它不会完美地再现原始图片)。