2009-11-16 02:06:38 +0000 2009-11-16 02:06:38 +0000
172
172

在linux中批量转换PNG到JPG

有没有人知道在linux中批量转换PNG到JPG的好方法?我使用的是Ubuntu)。

一个png2jpg的二进制文件,我可以直接放到一个shell脚本中就好了。

答案 (10)

247
247
247
2009-11-16 02:15:29 +0000

你最好的办法是使用Imagemagick

我不是实际使用的专家,但我知道你可以用这个来做任何与图像相关的事情!

的例子是:

convert image.png image.jpg

,它可以保留原始图像,也可以创建转换后的图像。至于批处理。我认为你需要使用Mogrify工具(在imagemagick中使用相同的命令行)。請記住,這個工具會覆蓋舊的圖片。

83
83
83
2013-01-28 02:45:11 +0000

最简单的解决方案就像大多数已经发布的那样。

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,还有一个替代语法。

26
26
26
2009-11-16 03:28:26 +0000

在许多Linux发行版中发现的convert命令是作为ImageMagick套件的一部分安装的。以下是运行convert命令的bash代码,可以在目录中的所有PNG文件上运行&007,从而避免双重扩展名问题:

for img in *.png; do
    filename=${img%.*}
    convert "$filename.png" "$filename.jpg"
done
11
11
11
2015-10-17 15:02:05 +0000

tl;dr

对于那些只想要最简单的命令:

转换保留原始文件:

mogrify -format jpg *.png

转换删除原始文件。

mogrify -format jpg *.png && rm *.png
bar.png
foo.png
foobar.jpg

Batch Converting Explained

有点晚了,但是为了给那些对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

解释*

转换和删除

  • 将所有的png文件转换为jpg文件,删除原文件。
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

说明

  • 第一部分和上面完全一样,它将创建新的jpg文件。简而言之: –当程序终止时,会返回一个退出状态。

- 由于*.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

8
8
8
2009-11-16 05:29:10 +0000

实际上,你要找的"png2jpg “命令实际上分为两个命令,分别叫pngtopnmcjpeg,它们分别属于netpbmlibjpeg-progs包的一部分。

6
6
6
2014-10-13 17:12:00 +0000
find . -name "*.png" -print0 | xargs -0 mogrify -format jpg -quality 50
5
5
5
2012-05-07 12:42:40 +0000

速战速决for i in $(ls | grep .png); do convert $i $(echo $i.jpg | sed s/.png//g); done

4
4
4
2016-10-22 09:37:31 +0000

很多年后,有一个png2jpeg实用程序,是我自己编写的。

3
3
3
2009-11-16 02:28:02 +0000

对于批处理:

for img in *.png; do
  convert "$img" "$img.jpg"
done

你会得到像image1.png.jpg这样的文件名。我不知道其他的shell,但唯一的区别可能是循环语法。

1
1
1
2016-09-17 02:34:45 +0000

这就是我在转换文件时使用的方法。我原来的方法是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