2

我只在 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
4

1 回答 1

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触发惰性函数评估的方式中存在错误。

当然,在选项 3 中,如果您只是想通过一次性任务完成此任务,您可能不会关心进一步调试。但是很有可能它会再次弹出一个不同的图像,所以如果你试图构建一个更广泛使用的程序,最好继续调试问题(从从崩溃转储中获取堆栈跟踪开始)。

有关上述所有功能的更多详细信息,请参阅文档

于 2012-11-16T20:40:04.550 回答