如何将 32MB 的 PNG 文件转换为 200Kbs 而不丢失其颜色

如何将 32MB 的 PNG 文件转换为 200Kbs 而不丢失其颜色

我有几张 32MB 大小的图像,我想将它们的大小从 32MB 更改为 100Kbs 或任何 KB 大小,而不影响其颜色。

我正在尝试的命令是:

muhammad@muhammad-mohsin:~/scans$ find . -iname '*.png' -exec mogrify -format jpg "*.png" {} +


muhammad@muhammad-mohsin:~/$ find . -type f -iname \*.png -delete


muhammad@muhammad-mohsin:~/$ find . -iname '*.jpg' -exec mogrify -define jpeg:extent=300kb -strip -quality 90 -scale 90% *.jpg {} +

在这里,我首先将 PNG 转换为 JPG,将其大小从 32Mbs 减小到 5.8Mbs,一切保持不变,但是当我使用第三个命令时,它会删除图像中的背景颜色并使其变得灰度模糊。

然而,文本仍然可读,但颜色和背景徽标却不可读。

我如何使用 convert、mogrify 或任何其他工具来实现这一点?到目前为止,我已经尝试了所有可能的方法。

这是原始图片的一部分

这是命令执行后图像改变的一部分

答案1

这是因为 JPEG 压缩的工作原理。它试图将彼此相似的相邻像素舍入为相似的值。这会导致细节丢失和块状化。

随着压缩级别的增加,这种情况会变得更加明显,确切地你正在做什么。此外,你正在分两个步骤进行:

  1. 无损(PNG)到有损(JPEG)压缩。
  2. 有损到有损压缩。

你会大概通过在最终质量上将无损转换为有损来获得更好的结果,因此只应用一次有损压缩,例如jpeg:extent=300kb -strip -quality 90 -scale 90%在第一次转换中使用。

此外,您没有提及图像的大小和细节程度。将其缩小到 300kB 并保持所需质量可能不可行。

为了消除背景斑点,您可以尝试在某些图像编辑软件中对文档应用阈值,例如,强制将低于某种灰色的任何内容变为白色。

然而,无论你做什么,从 30MB 无损格式压缩到 300kB 有损格式将要导致质量明显下降。

答案2

我正在尝试,find . -iname '*.png' -exec convert -resize 60% -quality 60 "*.jpg" {} +但是没有用。

参考。https://superuser.com/questions/71028/batch-converting-png-to-jpg-in-linux

$ ls -1 *.png | xargs -n 1 bash -c 'convert -quality 60 "$0" "${0%.*}.jpg"'

将我的示例 31MB.png 转换为 1.4MB.jpg。...您可能需要重复例如$ ls -1 *.PNG | ...等。

参考@steeldriver 的评论:“稍微好一点的是xargs -d '\n' -n 1

相关内容