你最好的办法是使用Imagemagick
我不是实际使用的专家,但我知道你可以用这个来做任何与图像相关的事情!
的例子是:
convert image.png image.jpg
,它可以保留原始图像,也可以创建转换后的图像。至于批处理。我认为你需要使用Mogrify工具(在imagemagick中使用相同的命令行)。請記住,這個工具會覆蓋舊的圖片。
最简单的解决方案就像大多数已经发布的那样。
for i in *.png ; do convert "$i" "${i%.*}.jpg" ; done
ls -1 *.png | xargs -n 1 bash -c 'convert "$0" "${0%.*}.jpg"'
由于某些原因,我倾向于避免在bash中使用循环,所以这里有一个更unixy xargs的方法,使用bash来命名。它使用GNU Parallel来同时运行多个作业,给你一个性能提升。它在很多系统中都是默认安装的,而且几乎肯定在你的repo中(这是一个很好的程序)。我发现在我的双核系统上使用3个作业的CPU使用率更高。
ls -1 *.png | parallel convert '{}' '{.}.jpg'
ls -1 *.png | parallel -j 3 convert '{}' '{.}.jpg'
如果你想知道一些统计信息(ETA,作业完成的时间,每个作业的平均时间…..
ls -1 *.png | parallel --eta convert '{}' '{.}.jpg'
如果你使用GNU Parallel,还有一个替代语法。
对于那些只想要最简单的命令:
转换和保留原始文件:
mogrify -format jpg *.png
转换和删除原始文件。
mogrify -format jpg *.png && rm *.png
bar.png
foo.png
foobar.jpg
有点晚了,但是为了给那些对Cli不熟悉的人澄清所有的困惑,这里有一个超级瘦身的参考和解释。
示例目录*
mogrify -format jpg *.png
保留所有原始的 png 文件,也可以创建 jpg 文件。
bar.png
bar.jpg
foo.png
foo.jpg
foobar.jpg
mogrify -format jpg *.png && rm *.png
结果*
bar.jpg
foo.jpg
foobar.jpg
解释*
-format
)
–在This tool is similar to convert except that the original image file is overwritten (unless you change the file suffix with the -format option)
选项中指定要改变格式,下一个参数需要是类型(本例中为jpg)。
–最后,- format
是输入文件(所有以.png结尾的文件)。for i in *.png; do mogrify -format jpg "$i" && rm "$i"; echo "$i converted to ${i%.*}.jpg"; done
结果*
find . -iname '*.png' | while read i; do mogrify -format jpg "$i" && rm "$i"; echo "Converted $i to ${i%.*}.jpg"; done
说明
*.png
执行的是短路评估,所以只有当没有错误时,才会执行正确的部分。这很有用,因为如果转换错误的话,你可能不想删除所有的原始文件。&&
命令会删除文件。
现在,这里有一些好东西给那些是舒服的人。
如果你想在转换文件的过程中获得一些输出:
n=0; find . -iname '*.png' | while read i; do mogrify -format jpg "$i" && rm "$i"; fn="all/$((n++)).jpg"; mv "${i%.*}.jpg" "$fn"; echo "Moved $i to $fn"; done
转换所有子目录中的所有 png 文件,并为每一个文件提供输出:
&001
转换所有子目录中的所有 png 文件,将所有生成的 jpgs 放到 0
目录中,将它们编号,删除原始 png 文件,并在每个文件发生时显示输出:
&001
很多年后,有一个png2jpeg实用程序,是我自己编写的。
对于批处理:
for img in *.png; do
convert "$img" "$img.jpg"
done
你会得到像image1.png.jpg这样的文件名。我不知道其他的shell,但唯一的区别可能是循环语法。
这就是我在转换文件时使用的方法。我原来的方法是TGA转PNG
find . -name "*.tga" -type f | sed 's/\.tga$//' | xargs -I% convert %.tga %.png
的概念是,你把你需要的文件find
,然后把扩展名去掉,然后用xargs
把它加回来。因此,对于PNG转JPG,你会改变扩展名,并做一件额外的事情来处理alpha通道,即设置背景(在这个例子中是白色的,但你可以改变它),然后将图像拉平
find . -name "*.png" -type f | sed 's/\.png$//' | xargs -I% convert %.png -background white -flatten %.jpg