2013-07-09 54 views
0

我想用Python中的PIL創建一個48位(RGB)TIFF文件(每個通道16位)。然而,即使我已經找到了一種方法,以各個通道存儲爲16位,我不能管理這些合併成一個單一的48位RGB圖像:用PIL創建一個48位TIFF文件

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

PIL不支持48位RGB爲輸出。看到list of modes supported,這裏不再重複完成:

  • (1位的像素,黑色和白色,存儲有每字節的一個像素)
  • 大號(8比特象素,黑色和白色)
  • P(8比特象素,使用調色板)
  • RGB(3×8比特象素,真彩色)
  • 映射到任何其他模式10
  • RGBA(4×8比特象素,真彩色與透明度掩模)
  • CMYK(4×8比特象素,分色)
  • 的YCbCr(3×8比特象素,彩色視頻格式)
  • (32位帶符號整數像素)
  • ˚F(32位浮點像素)

PIL還提供有限的支持少數特殊模式,包括LA(L用α),RGBX(真彩色與填充)和的RGBA(真彩色與預乘alpha)。但是,PIL不支持用戶定義的模式; 如果您要處理上面未列出的波段組合,請使用一系列Image對象。

還要注意的是PIL不支持進口 48位RGB,但其轉換爲32位RGBA導入時(見unpackRGB16B功能)。

+0

請注意,PIL支持_importing_ 48位RGB,但在導入時將其轉換爲32位RGBA(請參見[Unpack.c]中的'unpackRGB16B'函數(http://svn.effbot.org/public /tags/pil-1.1.4/libImaging/Unpack.c))。 – abarnert

+0

@abarnert謝謝,我補充說明答案 – jterrace

3

由於the docs和jterrace的回答說,如果你想與RGB16 PIL,你必須:

使用圖像對象的序列。

這是否意味着你需要單獨保存Image對象和不同的軟件結合起來呢?

這是顯而易見的答案。但可能有更好的辦法。將R,G和B平面像素圖交織到一個單一的RGB像素圖中是微不足道的(並且快速,具有numpy),所以您可以創建一個原始像素圖而不是嘗試創建一個Image。您可以將其保存爲二進制文件 - 或者,如果您選擇的「不同軟件」是Python庫,則只需在內存中執行即可。