Answers:
最好的选择是使用Imagemagick
我不是实际用法专家,但是我知道您几乎可以做任何与此有关的图像!
一个例子是:
convert image.png image.jpg
它将保留原始图像并创建转换后的图像。至于批次。我认为您需要使用Mogrify工具(在imagemagick中使用相同的命令行)。请记住,这会覆盖旧图像。
该命令是:
mogrify -format jpg *.png
mogrify -format jpg -background black -flatten *.png
mogrify -format jpeg img.png
我有2个文件并file img.*
报告一个png(原始未修改)和一个新的jpeg 后,在我的Linux框上使用@KevinCox 。因此mogrify
,在这种情况下,请勿覆盖原始文件。
mogrify
文档中:“ 此工具类似于,convert
除了原始图像文件(除非使用-format选项更改文件后缀)外,还可以根据您的要求进行任何更改。 ”
我还有几个解决方案。
最简单的解决方案就像大多数已经发布的解决方案一样。一个简单的bash for循环。
for i in *.png ; do convert "$i" "${i%.*}.jpg" ; done
由于某种原因,我倾向于避免bash中的循环,因此这是一种更加统一的xargs方法,使用bash进行名称处理。
ls -1 *.png | xargs -n 1 bash -c 'convert "$0" "${0%.*}.jpg"'
我用的那个。它使用GNU Parallel一次运行多个作业,从而提高了性能。默认情况下,它已安装在许多系统上,并且几乎肯定在您的存储库中(这是一个很好的程序)。
ls -1 *.png | parallel convert '{}' '{.}.jpg'
作业数默认为您拥有的进程数。我在双核系统上使用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
done
循环的末尾需要一个。另外,对于并行的东西,您可以避免将其ls
与类似以下内容的管道一起使用:(parallel -j 3 --eta convert '{}' '{.}.jpg' ::: *.png
请参阅此处)
ls
自己的方法,因为它对我来说更有意义。
--
而不是:::
)-即便如此,它仍然令人沮丧地缺少GNU并行的某些功能。
convert
在许多Linux发行版中找到的命令是作为ImageMagick套件的一部分安装的。以下是convert
在目录中的所有PNG文件上运行的bash代码,可以避免这种双重扩展问题:
for img in *.png; do
filename=${img%.*}
convert "$filename.png" "$filename.jpg"
done
for f in *.png; do convert "$f" "${f/%png/jpg}"; done
对于只需要最简单命令的用户:
转换并保留原始文件:
mogrify -format jpg *.png
转换和删除原始文件:
mogrify -format jpg *.png && rm *.png
Kinda参加聚会很晚,但只是为了消除对可能不太熟悉cli的人的所有困惑,这里有个超级笨拙的参考和解释。
示例目录
bar.png
foo.png
foobar.jpg
保留所有原始png文件以及创建jpg文件。
mogrify -format jpg *.png
结果
bar.png
bar.jpg
foo.png
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)
)- format
选项指定您将要更改格式,下一个参数必须是类型(在本例中为jpg)。*.png
是输入文件(所有以.png结尾的文件)。将所有png文件转换为jpg,删除原始文件。
mogrify -format jpg *.png && rm *.png
结果
bar.jpg
foo.jpg
foobar.jpg
说明
&&
是一个布尔运算符。简而言之:
0
无错误”。&&
执行短路评估,因此只有在没有错误的情况下才执行正确的部分。这很有用,因为如果转换原始文件时出错,您可能不想删除所有原始文件。rm
命令删除文件。现在,这里是对谁的人一些东西是舒适的CLI。
如果在转换文件时需要一些输出:
for i in *.png; do mogrify -format jpg "$i" && rm "$i"; echo "$i converted to ${i%.*}.jpg"; done
转换所有子目录中的所有png文件,并为每个子目录提供输出:
find . -iname '*.png' | while read i; do mogrify -format jpg "$i" && rm "$i"; echo "Converted $i to ${i%.*}.jpg"; done
转换所有子目录中的所有png文件,将所有生成的jpg放入all
目录中,对其编号,删除原始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
while read
我的快速解决方案
for i in $(ls | grep .png); do convert $i $(echo $i.jpg | sed s/.png//g); done
for f in ./*.png; do convert "$f" "${f%.*}.jpg"; done
。这避免了完全没有必要ls
,grep
并sed
调用(和echo
,但IIRC这是Bash内建的,因此不会有任何/很小的性能影响),并摆脱两个管道和两个子shell的,并涉及较少打字。由于不是所有版本ls
都可以安全解析,因此它甚至更具可移植性。
当文件跨越多个目录时,这就是我用来转换的内容。我最初的是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