在Python中快速加载和显示图像(使用Libjpeg Turbo吗?)

2 投票
3 回答
5666 浏览
提问于 2025-04-17 01:51

我现在正在用Python的Tkinter和PIL创建一个图片查看器,但我想让图片加载得更快。因此,我想知道如何在Tkinter和PIL中安装和使用Libjpeg Turbo,或者我是否应该使用其他的图形界面工具包,比如pyQT,或者使用其他的图像处理库(我发现有个叫OpenCV的东西?)。

总的来说,我想知道在Python中加载、调整大小和显示大图片的最佳和最快的方法是什么?

补充说明:我觉得主要的问题在于图片的调整大小,这个过程比较明显,但在这之前,图片的加载本身也很慢。不过我不太确定,因为我不知道怎么测量这些东西,毕竟我还是个Python新手。

我做的基本上是一个简约的图片查看器。如果你想看看我的代码,可以在这里找到: http://pastebin.com/fwf8b0cU

补充说明2:我用cProfile分析了一下代码,修复了一些问题,改善了一些慢的地方。所以现在我的问题是,我是否应该使用其他的图形界面工具包,比如pyQT,或者使用其他的图像处理库(我发现有个叫OpenCV的东西?)。

3 个回答

0

这个问题虽然老了,但这里的回答没有涉及到如何和PIL一起使用。

下面的讨论解释得更详细,但简单来说就是:

conda uninstall -y --force pillow pil jpeg libtiff libjpeg-turbo
pip   uninstall -y         pillow pil jpeg libtiff libjpeg-turbo
conda install -yc conda-forge libjpeg-turbo
CFLAGS="${CFLAGS} -mavx2" pip install --upgrade --no-cache-dir --force-reinstall --no-binary :all: --compile pillow-simd
conda install -y jpeg libtiff

来源: https://docs.fast.ai/performance.html#faster-image-processing

不过,这个方法似乎只在Linux上有效。在MacOS X上,Pillow-SIMD的版本似乎没有正确链接到libjpeg-turbo库。

总之,一旦在本地编译完成,pillow-simd就会替代PIL,这样你就能享受到libjpeg-turbo和simd带来的加速效果。

1

你可以看看 PyTurboJPEG,这是一个Python的工具,它是 libjpeg-turbo 的包装,能够在解码大JPEG图片时,快速地调整图片大小(比如缩小到原来的1/2、1/4或1/8)。

from turbojpeg import TurboJPEG

# specifying library path explicitly
# jpeg = TurboJPEG(r'D:\turbojpeg.dll')
# jpeg = TurboJPEG('/usr/lib64/libturbojpeg.so')
# jpeg = TurboJPEG('/usr/local/lib/libturbojpeg.dylib')

# using default library installation
jpeg = TurboJPEG()

# direct rescaling 1/2 while decoding input.jpg to BGR array
in_file = open('input.jpg', 'rb')
bgr_array_half = jpeg.decode(in_file.read(), scaling_factor=(1, 2))
in_file.close()
1

如果你想找出程序慢的原因,我建议你可以用一些工具来测量你代码的不同部分运行的时间,叫做 timeit。如果这样做没有效果,或者觉得太麻烦了,可以试试 Python Profilers,这个工具可以帮助你分析代码的性能。

撰写回答