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

taut 发布于 2019-02-11 cmyk 最后更新 2019-02-11 21:14 13 浏览

我只在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
已邀请:

qullam

赞同来自:

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触发懒惰函数评估的方式中存在错误。< / LI>
当然在选项3中,如果你只是试图通过一次性任务,你可能不关心进一步调试。但是很有可能它会再次弹出不同的图像,所以如果你试图构建一个程序以供更广泛使用,最好继续调试问题(从崩溃转储中获取堆栈跟踪)。 有关上述所有功能的更多详细信息,请参阅the docs