使用PIL在Python中创建48位TIFF文件

时间:2013-07-09 22:06:44

标签: python image python-imaging-library rgb tiff

我想在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位文件并将它们与不同的软件结合使用?

2 个答案:

答案 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,此处重复完成:

  • 1 (1位像素,黑白,每字节存储一个像素)
  • L (8位像素,黑白)
  • P (8位像素,使用调色板映射到任何其他模式)
  • RGB (3x8位像素,真彩色)
  • RGBA (4x8位像素,带透明蒙版的真彩色)
  • CMYK (4x8位像素,分色)
  • YCbCr (3x8位像素,彩色视频格式)
  • (32位有符号整数像素)
  • F (32位浮点像素)
  

PIL还为一些特殊模式提供有限的支持,包括 LA (带有alpha的L), RGBX (带填充的真彩色)和 RGBa (预乘alpha的真彩色)。但是,PIL不支持用户定义的模式; 如果要处理上面未列出的波段组合,请使用一系列图像对象。

另请注意,PIL支持导入 48位RGB,但在导入时会将其转换为32位RGBA(请参阅unpackRGB16B函数)。