使用PIL保存CMYK tif图像时,Python.exe崩溃

时间:2012-11-14 19:29:27

标签: python python-imaging-library tiff cmyk

我只在PIL中使用CMYK tif图像时遇到麻烦。问题是一切似乎都很好,我可以加载文件,保存它,但当我裁剪它并尝试保存它时python.exe只是挂起。这是我会议的粗略记录:

>>> import os
>>> from PIL import Image
>>> os.listdir(".")
['CMYK_TIFF.tif', 'GRAYSCALE_TIFF.tif', 'RGB_TIFF.tif']
>>> im = Image.open("CMYK_TIFF.tif")
>>> im
<PIL.TiffImagePlugin.TiffImageFile image mode=CMYK size=4320x3240 at 0x2630B88>
>>> points = (12, 3, 44, 88)
>>> im = im.crop(points)
>>> im
<PIL.Image._ImageCrop image mode=CMYK size=32x85 at 02630B48>
>>> im.save("new_image.tif")

此时python.exe崩溃了。这不是一个孤立的问题,它在这一点上是一致的。

非常感谢任何帮助!

PD:我在Windows 7 x64操作系统中使用python 2.7.3和PIL 1.1.7。

PD2:Python崩溃转储:

Descripción (description)
Ruta de acceso de la aplicación con errores (filepath to the application with errors):                 C:\Python27\python.exe
Firma del problema (problem signature)
Nombre de evento de problema (name of the event or problem):    APPCRASH
Nombre de la aplicación (application name): python.exe
Versión de la aplicación (aplication version):  0.0.0.0
Marca de tiempo de la aplicación (timestamp):   4f84a524
Nombre del módulo con errores (Name of the module with errors): MSVCR90.dll
Versión del módulo con errores (version of the module with errors): 9.0.30729.6161
Marca de tiempo del módulo con errores (module timestamp):  4dace4e7
Código de excepción (exception code):   c0000005
Desplazamiento de excepción (exception displacement):   000000000001e2e0
Versión del sistema operativo (OS version): 6.1.7601.2.1.0.256.48
Id. de configuración regional (regional configuration id):  11274
Información adicional 1:    3312
Información adicional 2:    3312c03e983672d704c6ef8ee1696a00
Información adicional 3:    b29d
Información adicional 4:    b29dcc8fc6f4d939931d139c4d9e8d31

Información adicional sobre el problema
Id. de depósito:    67567272

1 个答案:

答案 0 :(得分:1)

crop函数实际上是懒惰的,这意味着在您尝试访问像素之前不会发生裁剪,在save期间会发生这种情况。

您可以通过致电load

来强制执行此操作
>>> im = im.crop(points)
>>> im
<PIL.Image._ImageCrop image mode=CMYK size=32x85 at 02630B48>
>>> im.load()
<PixelAccess at 0x108d2ba70>
>>> im.save("new_image.tif")

我最初建议将其作为一种帮助调试问题的方法,因为有三件事情可能发生:

  1. 如果load崩溃,则问题在于强制评估作物。
  2. 如果load成功,但save崩溃,则问题在于保存(某些)TIFF图像。
  3. 如果它们都成功了...首先想到的可能性是你没有足够的记忆力来同时保持裁剪和未裁剪的版本,或者save触发评估的方式中存在某个错误懒惰的功能。
  4. 当然,在选项3中,如果你只是试图通过一次性任务,你可能不关心进一步调试。但是很有可能它会再次弹出不同的图像,所以如果你正在尝试构建一个更广泛使用的程序,最好继续调试问题(从崩溃转储中获取堆栈跟踪)。

    有关上述所有功能的详细信息,请参阅the docs