我想在Python中使用PIL创建一个48位(RGB)TIFF文件(每通道16位)。但是,即使我找到了将各个通道存储为16位的方法,我也无法将这些通道合并为一个48位RGB图像:
In [3]: import numpy as np
In [4]: from PIL import Image
In [5]: r = np.array([[1,2],[3,4]], dtype=np.uint16)
In [6]: i = Image.fromarray(r, mode='I;16')
In [7]: Image.merge("RGB", (i,i,i))
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-7-35aa00ddbb2e> in <module>()
----> 1 Image.merge("RGB", (i,i,i))
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/PIL/Image.pyc in merge(mode, bands)
2059 for im in bands[1:]:
2060 if im.mode != getmodetype(mode):
-> 2061 raise ValueError("mode mismatch")
2062 if im.size != bands[0].size:
2063 raise ValueError("size mismatch")
ValueError: mode mismatch
有没有人对如何解决这个问题有任何想法?或者我是否需要将通道保存为单独的16位文件并将它们与不同的软件结合使用?
答案 0 :(得分:3)
正如the docs和jterrace的回答所说,如果你想要RGB16和PIL,你必须:
使用一系列Image对象。
这是否意味着您需要单独保存Image
个对象并将它们与不同的软件结合使用?
这是明显的答案。但可能有更好的方法。将R,G和B平面像素图交错到单个RGB像素图中是微不足道的(并且快速,有numpy),因此您可以创建单个原始像素图而不是尝试创建Image
。您可以将其保存到二进制文件中 - 或者,如果您选择的“不同软件”是Python库,则只需在内存中执行。
答案 1 :(得分:2)
PIL不支持输出的输出的48位RGB。请参阅list of modes supported,此处重复完成:
PIL还为一些特殊模式提供有限的支持,包括 LA (带有alpha的L), RGBX (带填充的真彩色)和 RGBa (预乘alpha的真彩色)。但是,PIL不支持用户定义的模式; 如果要处理上面未列出的波段组合,请使用一系列图像对象。
另请注意,PIL支持导入 48位RGB,但在导入时会将其转换为32位RGBA(请参阅unpackRGB16B函数)。