在Python中快速加载和显示图像(使用Libjpeg Turbo吗?)
我现在正在用Python的Tkinter和PIL创建一个图片查看器,但我想让图片加载得更快。因此,我想知道如何在Tkinter和PIL中安装和使用Libjpeg Turbo,或者我是否应该使用其他的图形界面工具包,比如pyQT,或者使用其他的图像处理库(我发现有个叫OpenCV的东西?)。
总的来说,我想知道在Python中加载、调整大小和显示大图片的最佳和最快的方法是什么?
补充说明:我觉得主要的问题在于图片的调整大小,这个过程比较明显,但在这之前,图片的加载本身也很慢。不过我不太确定,因为我不知道怎么测量这些东西,毕竟我还是个Python新手。
我做的基本上是一个简约的图片查看器。如果你想看看我的代码,可以在这里找到: http://pastebin.com/fwf8b0cU
补充说明2:我用cProfile分析了一下代码,修复了一些问题,改善了一些慢的地方。所以现在我的问题是,我是否应该使用其他的图形界面工具包,比如pyQT,或者使用其他的图像处理库(我发现有个叫OpenCV的东西?)。
3 个回答
这个问题虽然老了,但这里的回答没有涉及到如何和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带来的加速效果。
你可以看看 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()
如果你想找出程序慢的原因,我建议你可以用一些工具来测量你代码的不同部分运行的时间,叫做 timeit。如果这样做没有效果,或者觉得太麻烦了,可以试试 Python Profilers,这个工具可以帮助你分析代码的性能。