位图深度 PIL.image.save()保存图片后size变大

今天,想用PIL在bmp图片上画带颜色的矩形。代码如下:

from PIL import Image,ImageDraw

img = Image.open("test.bmp”)
img = img.convert("RGB")
draw = ImageDraw.Draw(img)
draw.rectangle((100, 200, 300, 400), width=6, outline=(0,255,0))
img.save("test_bak.bmp", quality=95)

结果发现新生成的图片Size大了3倍!
找原因,刚开始以为是quality参数的值设大了,改到多小多没用。
后来仔细对比了两张图片的信息,终于发现了是位深不一样,原图位深是8,而新图片是24。这也就解释了为什么Size大了3倍。

那么,这个位深是啥概念呢?上网查了一下。根据三原色原理,图像的每一点其实是由三点组成,电脑来说就是红绿蓝,这三个点的不同亮度所呈现给用户的感觉就是不同的颜色。

而所谓的深度,就是各色素的从最暗到最亮的“刻度”范围,刻度越多,自然色彩控制也就越逼真,反之就失真。
所以,32位所表现的的色彩当然要比24位逼真,24位当然要比16位逼真,以此类推。深度越大,也就意味着图像文件越大,电脑处理起来时间也就越长,占用的空间也就越可观。

在我的程序里,很容易发现这个深度是在哪里被转换的,就是img.convert(“RGB”)。
根据PIL.Image的文档,图片深度的属性是由mode来控制的。
在这里插入图片描述
而PIL.Image都支持哪些Modes呢?
在这里插入图片描述
我把转换前的img.mode打印出来,结果是“L”,也就是8位深的黑白图。我为了在图片上画绿色的框,转成了RGB,也就是24位深带颜色的图。所以就很清楚这个程序是怎么回事了。

那么接下来就看个人取舍了。我暂时可以接受图片变大,因为这只是生成的临时文件,用完我就会删除它。如果有别的需求,可以再想别的办法,这得根据需求来选择解决方案。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章