如何在Python中更有效地压缩JPEG?

如何在Python中更有效地压缩JPEG?,python,python-imaging-library,pathlib,Python,Python Imaging Library,Pathlib,我在一个定期更新的库中处理数千个大型图像文件。下面的脚本完成了这项工作(平均减少了文件大小~95%),但压缩一幅图像大约需要25秒。显然,我可以让脚本在一夜之间运行,但是如果我可以从这个过程中节省一些时间,那就太酷了。我主要是寻找脚本中任何不必要的冗余或开销,这些冗余或开销可以被删除以加快进程。我对Python还是新手,所以对我放松点 from PIL import Image from pathlib import Path import os, sys import glob root_d

我在一个定期更新的库中处理数千个大型图像文件。下面的脚本完成了这项工作(平均减少了文件大小~95%),但压缩一幅图像大约需要25秒。显然,我可以让脚本在一夜之间运行,但是如果我可以从这个过程中节省一些时间,那就太酷了。我主要是寻找脚本中任何不必要的冗余或开销,这些冗余或开销可以被删除以加快进程。我对Python还是新手,所以对我放松点

from PIL import Image
from pathlib import Path
import os, sys
import glob

root_dir = "/.../"

basewidth = 3500

for filename in glob.iglob(root_dir + '*.jpg', recursive=True):
    p = Path(filename)
    img = p.relative_to(root_dir)
    new_name = (root_dir + 'compressed/' + str(img))
    print(new_name)
    im = Image.open(filename)
    wpercent = (basewidth/float(im.size[0]))
    hsize = int((float(im.size[1])*float(wpercent)))
    im = im.resize((basewidth,hsize), Image.ANTIALIAS)
    im.save(new_name, 'JPEG', quality=40)

谢谢

正如我在评论中提到的,您可以在没有Python的情况下完成这项工作,只需在带有ImageMagick的终端上,它包含在大多数Linux发行版中,并且可用于macOS和Windows

看起来你想把一堆JPEG图像转换成3500像素的宽度,质量为40,对吗

制作一个包含100个左右JPEG的测试目录,这是一个非珍贵文件的副本,您可以在其中播放和实验。此命令应转换一个JPEG,因此请首先尝试:

magick input.jpg -quality 40 -resize 3500x result.jpg
如果这看起来正确,此命令将对当前目录中的所有JPEG执行完全相同的操作,并将结果保存在名为
processed
的子目录中:

mkdir processed
magick mogrify -path processed -resize 3500x -quality 40 *.jpg
如果这看起来正确,我们可以下一步将其并行化。。让我知道进展如何


您也可以使用
libvips
来执行此操作。因此,要处理一个图像:

vipsthumbnail input.jpg -o result.jpg[Q=40] --size 3500x
并在所有100张图像上尝试以下操作:

for f in *.jpg ; do
    echo "Processing $f"
    vipsthumbnail "$f" -o processed/"$f"[Q=40] --size 3500x
done
如果这更快,我们可以同时进行


如果您在macOS上,您可以使用自制安装ImageMagickVIP

brew install imagemagick
brew install vips

如果您有可用的代码,并且正在寻求改进,那么您可以使用@MikeScotty Gotcha并行处理多个文件。谢谢@我会调查的。谢谢Pil的速度并不出名。你可能会寻找另一个库。嘿,马克,在你的例子中,我把“VIP”换成了“vipsthumbnail”,希望没问题。vipsthumbnail接受3500x语法,因此它更适合解决此问题。