有人知道在 Linux 中将一堆 PNG 批量转换为 JPG 的好方法吗?(我使用的是 Ubuntu)。
我可以直接放入 shell 脚本的 png2jpg 二进制文件是理想的。
答案1
答案2
我还有几个解决方案。
最简单的解决方案与大多数已发布的解决方案类似。一个简单的 bash for 循环。
for i in *.png ; do convert "$i" "${i%.*}.jpg" ; done
由于某种原因,我倾向于避免在 bash 中使用循环,因此这里是一种更 unixy xargs 的方法,使用 bash 进行名称处理。
ls -1 *.png | xargs -n 1 bash -c 'convert "$0" "${0%.*}.jpg"'
我使用的就是这个。它使用 GNU Parallel 同时运行多个作业,从而提高性能。它在许多系统上默认安装,并且几乎肯定在您的存储库中(这是一个不错的程序)。
ls -1 *.png | parallel convert '{}' '{.}.jpg'
作业数量默认与您拥有的 CPU 核心数量相同。我发现在双核系统上使用 3 个作业可以提高 CPU 使用率。
ls -1 *.png | parallel -j 3 convert '{}' '{.}.jpg'
如果您想要一些统计数据(预计到达时间、已完成的工作、每项工作的平均时间......)
ls -1 *.png | parallel --eta convert '{}' '{.}.jpg'
如果您使用 GNU Parallel,还有另一种语法。
parallel convert '{}' '{.}.jpg' ::: *.png
对于其他一些版本(包括 debian),也有类似的语法。
parallel convert '{}' '{.}.jpg' -- *.png
答案3
许多 Linux 发行版上的命令都是作为 ImageMagick 套件的一部分安装的。以下是用于在目录中的所有 PNG 文件上convert
运行并避免双重扩展问题的 bash 代码:convert
for img in *.png; do
filename=${img%.*}
convert "$filename.png" "$filename.jpg"
done
答案4
您正在寻找的实际“ png2jpg
”命令实际上分为两个称为pngtopnm
和的命令cjpeg
,它们分别是netpbm
和libjpeg-progs
包的一部分。
png2pnm foo.png | cjpeg > foo.jpeg