磁盘上的图像文件大小(KB)随着Java中动态图像大小的调整(减小大小)而增加

Posted

技术标签:

【中文标题】磁盘上的图像文件大小(KB)随着Java中动态图像大小的调整(减小大小)而增加【英文标题】:Image file size on disk(KB) is getting increased upon the dynamic image resize(reducing size) in java 【发布时间】:2012-12-13 09:14:08 【问题描述】:

我是 Java 新手。我通过保持纵横比将大尺寸的 png 文件调整为标准文件大小。下面是我使用的代码 sn-p。但我在这段代码 sn-p 中看到的缺点是,在重新调整大小后,文件大小比原来的大得多。例如,原始大小为 5kb,重新调整大小的新大小为 16kb。

请帮助我避免此文件在调整大小时变大

 public void SaveImage(String imagePath, BufferedImage image) 
        try 
            BufferedImage bi = image;
            File newImageFile = new File(imagePath);
            ImageIO.write(bi, "png", newImageFile);
         catch (IOException e) 

        
    

    public BufferedImage resizeImage(final Image image, Dimension newDimension) 
        final BufferedImage bufferedImage = new BufferedImage(newDimension.width, newDimension.height, BufferedImage.TYPE_INT_RGB);
        final Graphics2D graphics2D = bufferedImage.createGraphics();
        //graphics2D.setComposite(AlphaComposite.Src);

        graphics2D.drawImage(image, 0, 0, newDimension.width, newDimension.height, null);
        graphics2D.dispose();

        return bufferedImage;
    

【问题讨论】:

【参考方案1】:

PNG 压缩的工作原理是这样的:它使用一个预测器从以前的值中预测一个像素值,而“zip”压缩产生的增量变化。图像中出现的低频内容越多,PNG 对它的压缩效果就越好。

调整大小会改变内容,并且可能会阻止 PNG 预测器检测可以更好地压缩的长时间运行。缩小图像会增强高频,从而导致更高的熵,从而导致更小的压缩比。

或者它只是由ImageIO writer 引起的,它可能没有为 PNG 设置最佳压缩方法。看看ImageWriter 和它的ImageWriterParamImageWriter可以通过ImageIO.getImageWritersByFormatName(String formatName)获取。

【讨论】:

请注意,这些图像正在调整大小而不是旋转 帖子从“旋转”更改为“调整大小”。 Neet,ImageWriterParam 不走运。还有其他选择吗?? 不,抱歉。刚刚自己检查了 PNGImageWriter,它看起来不支持任何类型的压缩设置。也许您可以在第二步中使用一些命令行实用程序来重新压缩调整大小的图像(例如 imagemagick 的转换)。 看起来是known bug。有趣的是,那个页面把我带到了JAI-ImageIO,它为 PNG 提供了一个 ImageIO 插件,它的 ImageWriteParam 确实支持压缩,但该库有一个缺点,即是本地库的一部分。

以上是关于磁盘上的图像文件大小(KB)随着Java中动态图像大小的调整(减小大小)而增加的主要内容,如果未能解决你的问题,请参考以下文章

在 Java 中比较图像大小 (KB)

随着窗口大小的变化,如何在wpf中动态测量网格宽度/高度

highcharts 怎么动态改变图像的大小

4KB 扇区磁盘上的 Linux:实际建议

android将相机捕获的图像的文件大小减小到小于500 kb

任何上传的图像文件都以相同的大小保存