kno*_*orv 33 compression image-manipulation image imagemagick image-processing
考虑处理上传可能非常大的PNG文件的应用程序.
必须将所有上载的文件存储到磁盘以供以后检索.但是,PNG文件的大小最大可达30 MB,但磁盘存储限制使每个文件大小最大为1 MB.
问题是获取文件大小最大为30 MB的输入PNG并生成文件大小低于1 MB的输出PNG.
这种操作显然是有损的 - 图像质量,颜色等的降低不是问题.但是,有一点不能改变的是图像尺寸.因此,尺寸为800x600的输入文件必须生成尺寸为800x600的输出文件.
以上概述的上述要求是严格的,不能更改.
使用ImageMagick(或其他一些开源工具),如何在不改变图像尺寸的情况下,将大小约为30 MB的输入PNG文件的文件大小减小到每个文件最大1 MB?
Eri*_* Pi 44
PNG不是一种有损的图像格式,因此您可能需要将图像转换为另一种格式 - 很可能是JPEG格式.JPEG具有可设置的"质量"因素 - 您可以简单地继续降低品质因数,直到您获得足够小的图像.所有这些都可以在不改变图像分辨率的情况下完成.
显然,根据图像,视觉质量的损失可能很大.JPEG最适合"真实生活"图像,例如来自相机的图片.对于徽标,屏幕截图或其他从"明亮"到"黑暗"的"锐利"过渡的图像,它的效果不佳.(另一方面,PNG具有相反的行为 - 最适合徽标等)
但是,在800x600时,将JPEG降至1MB以下可能非常容易.(我会非常惊讶地看到这些小尺寸的30MB文件.)事实上,即使是未压缩的,图像也只有1.4MB左右:
800 pixels * 600 pixels * 3 Bytes / color = 1,440,000 Bytes = 1.4MB
Run Code Online (Sandbox Code Playgroud)
因此,您只需要1.4:1的压缩比即可将图像降至1MB.根据图像的类型,PNG压缩可以很好地提供该级别的压缩.如果没有,JPEG几乎可以肯定 - 大约10:1的JPEG压缩率并不罕见.同样,输出的质量/大小将取决于图像的类型.
最后,虽然我在一段时间内没有使用过ImageMagick,但我几乎可以肯定有一些选项可以使用特定的品质因子重新压缩图像.仔细阅读文档,然后开始尝试!
编辑:使用ImageMagick看起来应该很容易.来自文档:
$magick> convert input.png -quality 75 output.jpg
Run Code Online (Sandbox Code Playgroud)
只需继续玩质量值,直到获得合适的输出.
您的示例很麻烦,因为800x600分辨率的30MB图像每像素存储500位.显然非常不切实际.请给我们实数.
同时,我尝试的"便宜又开朗"的方法如下:将图像缩小6倍,然后将其缩放6倍,然后通过PNG压缩运行.如果你运气好的话,你会将图像尺寸缩小36倍.如果运气不好,那么节省的费用就更像是6.
pngtopng big.png | pnmscale -reduce 6 | pnmscale 6 | pnmtopng > big.png
Run Code Online (Sandbox Code Playgroud)
如果这还不够,你可以ppmquant在中间(在小图像上)折腾以减少颜色数量.(例子是netpbm/pbmplus,我总是比ImageMagick更容易理解.)
要知道这样的解决方案是否合理,我们必须知道您的问题的真实数量.
此外,如果您真的要永久丢弃这些信息,那么使用JPEG压缩几乎肯定会更好,因为JPEG压缩旨在合理地优雅地丢失信息.是否有某些原因JPEG不适合您的应用程序?