减小非常大的图像的文件大小,而无需更改图像尺寸
image
image-manipulation
image-processing
imagemagick
15
1

考虑一个处理可能非常大的PNG文件上载的应用程序。

所有上载的文件必须存储到磁盘以供以后检索。但是,PNG文件的最大大小为30 MB,但是磁盘存储限制使每个文件的最大大小为1 MB。

问题是采用文件大小最大为30 MB的输入PNG并产生文件大小小于1 MB的输出PNG。

显然,此操作将是有损的-降低图像质量,颜色等不是问题。但是,必须更改的一件事是图像尺寸。因此,尺寸为800x600的输入文件必须产生尺寸为800x600的输出文件。

以上概述的上述要求非常严格,不能更改。

使用ImageMagick(或其他一些开源工具)如何在不更改图像尺寸的情况下将大小约为30 MB的输入PNG文件的文件大小减小到最大1 MB?

参考资料:
Stack Overflow
收藏
评论
共 5 个回答
高赞 时间 活跃

由于图像文件的大小与图像尺寸和颜色数直接相关,因此您似乎只有一个选择:减少颜色数。

和30MB〜降至1MB是一个非常大的下降。

转换为单色很难达到这个比例。

收藏
评论

这很大程度上取决于您最终想要什么,我经常喜欢在保留尺寸的同时减少颜色数量。在许多情况下,减少的颜色并不重要。这是将颜色减少到254的示例。

convert -colors 254 in.png out.png
收藏
评论

您的示例很麻烦,因为30MB分辨率为800x600的图像每像素存储500位 。显然非常不现实。请给我们实数。

同时,我将尝试的“便宜而愉快”的方法如下:将图像缩小6倍,然后将图像放大6倍,然后通过PNG压缩进行处理。如果运气好的话,您可以将图像尺寸缩小36倍。如果运气不好的话,可以节省的费用大约为6。

pngtopng big.png | pnmscale -reduce 6 | pnmscale 6 | pnmtopng > big.png

如果这还不够,您可以在中间(在小图像上)扔一个ppmquant以减少颜色数量。 (示例是netpbm / pbmplus ,我发现它总是比ImageMagick更容易理解。)

要知道这种解决方案是否合理,我们必须知道您问题的真实数目。

另外,如果您真的要永久丢弃信息,那么使用JPEG压缩几乎可以肯定会更好,JPEG压缩旨在合理地合理地丢失信息。出于某些原因,JPEG是否不适用于您的应用程序?

收藏
评论

PNG并非有损图像格式,因此您可能需要将图像转换为另一种格式-最有可能是JPEG。 JPEG具有可设置的“质量”因子-您可以继续降低质量因子,直到获得足够小的图像为止。所有这些都可以在不更改图像分辨率的情况下完成。

显然,视图像而定,视觉质量的损失可能很大。 JPEG最适合“真实生活”的图像,例如相机的照片。对于徽标,屏幕截图或其他具有从浅到深的“清晰”过渡的图像,它的效果不佳。 (另一方面,PNG具有相反的行为-最好用于徽标等)

但是,在800x600分辨率下,将JPEG压缩到1MB以下可能非常容易。 (看到这么小的尺寸会有30MB的文件,我会感到非常惊讶。)实际上,即使未压缩 ,图像的大小也只有1.4MB左右:

800 pixels * 600 pixels * 3 Bytes / color = 1,440,000 Bytes = 1.4MB

因此,您只需要1.4:1的压缩率即可将图像减小到1MB。根据图像的类型,PNG压缩可以很好地提供这种压缩级别。如果不是这样,JPEG几乎可以肯定是JPEG压缩率大约为10:1的情况并不罕见。同样,输出的质量/大小将取决于图像的类型。

最后,虽然我已经有一段时间没有使用ImageMagick了,但是我几乎可以肯定,有些选项可以使用特定的品质因数来重新压缩图像。阅读文档,然后开始实验!

编辑:看起来,使用ImageMagick应该确实很容易。从文档

$magick> convert input.png -quality 75 output.jpg

只是继续使用质量值,直到获得合适的输出为止。

收藏
评论

您可以尝试使用pngquant实用程序。安装和使用非常简单。而且它可以大量压缩PNG,而不会造成明显的质量损失。

安装后,请尝试以下操作:

pngquant yourfile.png
pngquant --quality=0-70 yourfile.png

对于我的演示图像(由imagemagick生成),第一个命令将350KB减小到110KB,第二个命令将其减小到65KB。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号