减小非常大的图片文件大小,而不改变图片尺寸

49
考虑一个处理上传潜在非常大的PNG文件的应用程序。所有上传的文件都必须存储到磁盘上以供以后检索。然而,PNG文件的大小可以达到30 MB,但磁盘存储限制每个文件的最大大小为1 MB。
问题是将大小高达30 MB的输入PNG文件生成大小低于1 MB的输出PNG文件。显然,这种操作会有损失,并且图像质量、颜色等的降低不是一个问题。然而,不能改变的一件事情是图像尺寸。因此,尺寸为800x600的输入文件必须产生一个尺寸为800x600的输出文件。
以上所述要求非常严格,不能更改。 使用ImageMagick(或其他开源工具),您如何缩小输入大小约为30 MB的PNG文件的文件大小,使每个文件的大小不超过1 MB,而图像尺寸不变?

请查看https://dev59.com/omw05IYBdhLWcg3w9mjd#11920384。 - That Brazilian Guy
12个回答

57
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应该非常容易。从docs中获取信息:
$magick> convert input.png -quality 75 output.jpg

只需不断调整质量值,直到获得合适的输出。


1
啊啊啊...我重新读了一遍你最初的问题。800x600只是一个示例尺寸。(我的错误。) 尽管如此,我的帖子其余部分仍然有效--迭代地降低质量,直到输出文件足够小。 - Eric Pi
只是补充一下,您可能需要针对每个图像执行上述步骤。 PNG 的质量水平并不能保证文件大小。例如,一个空白图像和一张压缩在相同质量级别的树木图像将具有非常不同的文件大小。文件大小取决于图像内容。 - Matt Warren
1
你也可以对PNG进行一些有损转换(减少颜色深度,改为索引等),只是这不是格式本身的一部分。例如,有一个叫做TinyPNG的工具(虽然它不是免费的),它可以大大缩小图像,而只会稍微降低其质量。 - Vlasec
从前六个单词开始解决我的问题。 - Waleed Abdalmajeed
通过查看最后三个句子(即给出的命令),解决了我的问题。 - undefined

8
你的例子存在问题,因为以800x600分辨率存储30MB图像会每像素存储500个比特,显然非常不现实。请提供真实的数字。
与此同时,我会尝试“便宜而简单”的方法:将图像缩小6倍,再将其放大6倍,然后运行PNG压缩。如果幸运的话,你将把图像大小减少36倍。如果不幸,节省的空间可能只有6倍左右。
pngtopng big.png | pnmscale -reduce 6 | pnmscale 6 | pnmtopng > big.png

如果这还不够,你可以在中间加入一个ppmquant(在小图像上)来减少颜色的数量。(这些示例是netpbm/pbmplus,我总是觉得比ImageMagick更容易理解。)
要知道这样的解决方案是否合理,我们必须了解你问题的真实数字。
此外,如果你真的要永久丢弃信息,你几乎肯定最好使用JPEG压缩,它被设计为相对优雅地失去信息。有没有某些原因,JPEG不适用于你的应用程序?

1
800x600只是一个例子。文件的尺寸因文件而异。 - knorv
@knorv:确实。如果您能将您的文件放在我们可以找到的地方,那可能会有所帮助。 - Norman Ramsey
嗨,我赞成这种方式是为了减小图像的大小。 我想知道一张图片每像素存储多少比特,并将图像缩小到合理的固定比特数。 因此,如果我有一个每像素有很多位的强大图像,我将会比一个每像素不那么多位的图像更加缩小。 谢谢 - Sérgio

5

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

将大小从30MB降至1MB是非常大的压缩比例。

通过转换为单色图像很难实现这种比例。


4

这很大程度上取决于你最终想要的效果,我通常喜欢在保留尺寸的同时减少颜色数量。在许多情况下,减少颜色并不会有太大影响。这里有一个将颜色减少到254的例子。

convert -colors 254 in.png out.png

4
使用ImageMagick对图片进行处理是一个不错的选择,但是使用pngquant --quality=0-80 in.png很可能会得到更小的文件大小。 - Kornel

4
你可以尝试使用pngquant工具,它非常简单易用。而且可以在不影响质量的情况下大幅压缩PNG文件大小。
安装完成后,可以尝试以下命令:
pngquant yourfile.png
pngquant --quality=0-70 yourfile.png

对于我生成的演示图片(使用imagemagick生成),第一条命令将其从350KB减小到110KB,第二条命令将其减小到65KB。


1
  • 步骤1:将图像缩小到原始大小的1/16。
  • 步骤2:减少颜色数量。
  • 步骤3:将图像大小增加回其原始大小。

0

我知道你想保留像素大小,但是你能否减小像素大小并调整存储在图像中的DPI,以便保留显示大小?这取决于您将使用哪个客户端来查看图像,但大多数客户端应该会遵守。如果您要在Web上使用图像,则可以设置<img>标记的像素大小。


0

这取决于图像的类型,它是真实生活中的图片还是计算机生成的图像, 对于真实生活中的图像,png 格式可能几乎不会压缩,甚至可能根本不会压缩,因此请使用 jpg 格式。如果图像具有有限数量的不同颜色(它可以具有 24 位图像深度,但唯一图像的数量将很少),则 png 可以相当好地压缩。 png 基本上是图像的 zip 实现,因此如果许多像素相同,则可以获得相当不错的压缩比率,如果需要无损压缩,请勿进行调整大小。


-1

-1

如果您想修改Ubuntu中的图像大小,可以尝试使用“GIMP”。

我在Ubuntu上尝试了几个图像编辑应用程序,这似乎是它们中最好的一个。

安装方法:

  • 打开终端
  • 输入:sudo apt install gimp-plugin-registry
  • 输入管理员密码。您需要联网才能完成此操作。
  • 安装完成后,使用GIMP图像编辑器打开图像。然后转到:文件 > 导出为 > 点击“导出”按钮
  • 您将看到一个小窗口,在其中选中“在图像窗口中显示预览”复选框。一旦选择此选项,您将可以看到文件当前大小以及质量级别。
  • 调整质量级别以增加/减少文件大小。
  • 完成调整后,最后点击“导出”按钮保存文件。

gimp uses the same libraries for that as ImageMagick - jogo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接