工作中需要對一幅PNG的16位灰階圖片進行處理,因為用於處理的程式很多天以前用Python和PIL寫好了,只不過有些參數因為時間太久記不清了。連蒙帶猜的湊齊了參數,運行時卻發現,運行過程中讀png檔案並複製的時候總是報錯。找了一下,很快發現原來是檔案格式不太合適,用的是16位灰階圖,趕快到PIL的文檔裡面去查,這一查心裡涼了半截,文檔裡面所說的PIL支援的檔案格式和類型沒有16位的,而且也沒有合適的可以轉換的格式:
摘自“Python Imaging Library Overview,PIL1.1.3”
正在著急的時候,忽然想起PIL也是開源的,趕緊到安裝目錄下看看。很快在裡面找到了png檔案的解析代碼(PngImagePlugin.py),裡面關於檔案格式的定義比文檔裡可豐富多了:
_MODES = {
# supported bits/color combinations, and corresponding modes/rawmodes
(1, 0): ("1", "1"),
(2, 0): ("L", "L;2"),
(4, 0): ("L", "L;4"),
(8, 0): ("L", "L"),
(16,0): ("I", "I;16B"),
(8, 2): ("RGB", "RGB"),
(16,2): ("RGB", "RGB;16B"),
(1, 3): ("P", "P;1"),
(2, 3): ("P", "P;2"),
(4, 3): ("P", "P;4"),
(8, 3): ("P", "P"),
(8, 4): ("LA", "LA"),
(16,4): ("RGBA", "LA;16B"), # LA;16B->LA not yet available
(8, 6): ("RGBA", "RGBA"),
(16,6): ("RGBA", "RGBA;16B"),
}
不光有16位灰階圖的支援,還可以支援RGB16位的映像,估計連作HDR都夠了,哈哈。用的時候也非常簡單,讀取檔案是可以自動識別的,而在建立檔案時,只要聲明其模式(mode)為"I;16B"即可。
還有一點需要小心,PIL所處理的16位灰階圖中,映像資料必須要作為圖片的背景,而不是其它的圖層來儲存,否則PIL會將該圖以RGB8的格式讀取和處理。