Back to home

Mac OSX lion 下PIL解析JPEG格式图片报错broken data stream问题

Mac OSX lion 下PIL解析JPEG格式图片报错broken data stream问题

简介

由于需要使用PIL在Python中进行对图片的操作,简单配了一下PIL后发现报错不断,最后还因为JPEG格式无法正常解析的问题耽搁了一段时间,最后定位是lion 64 bit编译的libjpeg问题。

更新:最好使用Pillow,它是PIL的Fork,主要解决PIL不更新后的各种环境部署问题。

安装PIL

假设Python已经安装好了,我使用的是Python 2.7.2。 需要安装两个前置类库:FreeType.,Libpng以及故事的主角Libjpeg。

这里有详尽的安装步骤,前置类库的安装不必拘泥这些特定的步骤,如果你使用了一些特殊的包管理系统也可以采用其他的方案安装(MacportsBrow)。

运行PIL发现无法通过JPEG自检

直接在命令行,PIL的源码目录下运行selftest.py脚本进行测试。

python selftest.py

发现JPEG格式报错 IOError: broken data stream …

定位原因

在Google 半天,都是推说Libjpeg版本错误(“ERROR: broken data stream when reading image file” (TrueType fonts libjpeg and PIL on OS X)),尝试在多个Libjpeg版本切换(6b,7,8d),其中编译libjpeg 6b还需要额外的配置,屡次尝试无果后,开始翻源码。 期间定位错误问题的原因,从错误码开始。加之PIL的报错时的堆栈信息,最后发现是调用jpeg解码对象的decode方法报错。 但是很久都没定位错误的原因,只能推测是Libjpeg报错,止步PIL。

这时帮我定位原因的Master决定在他的平台上测试一下,过一会儿又说在他那里跑selftest.py没有问题。然后问我是不是机器平台的问题。忽然想到Lion是64位的,于是重新安装libjpeg8d,然后重新安装PIL,最终解决问题。 相似的问题记录这里也有一个案例

最后是我解决时编译libjpeg 8d的configure配置:

dreampuf@HX:~/tmp/enhance/jpeg-8d$ ./configure --disable-dependency-tracking CFLAGS='-arch x86_64 -arch i386' --enable-static --enable-shared