我创建了一个int的numpy数组,然后将其转换为uint32
类型的PIL Image
,然后尝试保存它。请参见下面的简单模拟代码:
import numpy
resLabels = numpy.ndarray(shape=(38000, 38000), dtype=numpy.int32)
resLabels.fill(0)
resLabels[0,0] = 10000000 # Just a dumb value to ensure that the int32 is required.
arr = resLabels.astype("uint32")
im = Image.fromarray(arr)
im.save("Test.tif")
不幸的是,当我试图保存图像时,在最后一行出现以下错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users//miniconda3/envs/Py39dev/lib/python3.9/site-packages/PIL/Image.py", line 2431, in save
save_handler(self, fp, filename)
File "/Users//miniconda3/envs/Py39dev/lib/python3.9/site-packages/PIL/TiffImagePlugin.py", line 1860, in _save
offset = ifd.save(fp)
File "/Users//miniconda3/envs/Py39dev/lib/python3.9/site-packages/PIL/TiffImagePlugin.py", line 945, in save
result = self.tobytes(offset)
File "/Users//miniconda3/envs/Py39dev/lib/python3.9/site-packages/PIL/TiffImagePlugin.py", line 889, in tobytes
data = self._write_dispatch[typ](self, *values)
File "/Users//miniconda3/envs/Py39dev/lib/python3.9/site-packages/PIL/TiffImagePlugin.py", line 699, in <lambda>
b"".join(self._pack(fmt, value) for value in values)
File "/Users//miniconda3/envs/Py39dev/lib/python3.9/site-packages/PIL/TiffImagePlugin.py", line 699, in <genexpr>
b"".join(self._pack(fmt, value) for value in values)
File "/Users//miniconda3/envs/Py39dev/lib/python3.9/site-packages/PIL/TiffImagePlugin.py", line 666, in _pack
return struct.pack(self._endian + fmt, *values)
struct.error: 'L' format requires 0 <= number <= 4294967295
经过快速测试,它似乎来自图像维度。对于30Kx30K的图像,一切正常,但对于40Kx40K的图像,一切都失败。
如何解决这个问题?
1条答案
按热度按时间bf1o4zei1#
我测试我的图像的整体大小:如果
width x height x channels x encoding
大于4294967295
,则使用tifffile库。