from PIL import Image
img = Image.open('xxx.gif')
print(img.mode)
对于一般的 gif
图片,你会得到输出 "P"
。
其他输出有"1-二值图",“L-灰度图”,“RGB-三原色”"RGBA-三原色+透明度alpha"等。
P
是什么意思P 可以理解为 palettised,这是由调色盘 palette
演变而来的,上例中使用gif图像做测试是因为大多数的GIF格式图片都使用调色盘。
调色盘存储在图像文件的文件头部附近,详细资料可以在网络中找到。
首先用大家熟悉的RGB图像为例,RGB图像是典型的不使用调色盘存储颜色的图像格式,所以RGB采用R,G,B三个通道,每个通道在每一个像素位置用1个字节即8个比特存储对应通道的颜色值(0~255),譬如纯红色的一张图,它的R通道上每一个值都是255,表示红色的程度
最大,而另外两个通道值为0,表示不存在该颜色的分量。
考虑涂色盘的一个重要优点
:减少存储空间使用量
简单地说,调色盘是一个预设好的表
,这张表最多能存储256中不同的调色方案
。调色方案是由RGB值定义的。
以下代码将会打印出图像img的调色板情况,按照256个配色方案*3个通道值的格式排列:
print(np.array(img.getpalette()).reshape(256,3))
回过头来,使用了调色盘的图像将会被单通道存储,每个像素位置的值是调色盘“表”中的索引,这在存储图像的时候空间要求从RGB的3个字节变成了1个字节
。
当然,因为表中有限的配色方案数量(256),能使用的颜色也是有限制的,这也是P格式图像的一个缺点。
PIL库提供了非常方便的函数:
img = img.convert('RGB')
执行以上语句即可完成转换,同时,请注意赋值回原图像变量,img.convert()
的执行不是inplace
的。
2019/12 Karl