工作中需要对一幅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的格式读取和处理。