位圖深度 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位深帶顏色的圖。所以就很清楚這個程序是怎麼回事了。

那麼接下來就看個人取捨了。我暫時可以接受圖片變大,因爲這只是生成的臨時文件,用完我就會刪除它。如果有別的需求,可以再想別的辦法,這得根據需求來選擇解決方案。

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