我有几张 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 压缩的工作原理。它试图将彼此相似的相邻像素舍入为相似的值。这会导致细节丢失和块状化。
随着压缩级别的增加,这种情况会变得更加明显,确切地你正在做什么。此外,你正在分两个步骤进行:
- 无损(PNG)到有损(JPEG)压缩。
- 有损到有损压缩。
你会大概通过在最终质量上将无损转换为有损来获得更好的结果,因此只应用一次有损压缩,例如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
”