android bitmap(一) ARGB_8888/RGB_565

weixin_33968104發表於2017-10-26
參考
總結

ARGB_8888佔記憶體、清晰度高、支援透明效果
RGB_565節省記憶體、清晰度適中、不支援透明效果

分析

開啟Android.graphics.Bitmap類裡有一個內部類Bitmap.Config類,在Bitmap類裡createBitmap(int width, int height, Bitmap.Config config)方法裡會用到,開啟個這個類一看

列舉變數
public static final Bitmap.Config ALPHA_8
public static final Bitmap.Config ARGB_4444
public static final Bitmap.Config ARGB_8888
public static final Bitmap.Config RGB_565

Bitmap.Config ARGB_4444:每個畫素佔四位,即A=4,R=4,G=4,B=4,那麼一個畫素點佔4+4+4+4=16位
Bitmap.Config ARGB_8888:每個畫素佔四位,即A=8,R=8,G=8,B=8,那麼一個畫素點佔8+8+8+8=32位
Bitmap.Config RGB_565:每個畫素佔四位,即R=5,G=6,B=5,沒有透明度,那麼一個畫素點佔5+6+5=16位
Bitmap.Config ALPHA_8:每個畫素佔四位,只儲存透明度,不儲存顏色。

一般情況下我們都是使用的ARGB_8888,由此可知它是最佔記憶體的,因為一個畫素佔32位,8位=1位元組,所以一個畫素佔4位元組的記憶體。假設有一張480x800的圖片,如果格式為ARGB_8888,那麼將會佔用1500KB的記憶體。

那麼對bitmap有何影響?
這裡都以ARGB_8888為基準來進行對比。
ARGB_4444:記憶體佔用減少一半,但是每個值圖片失真度很嚴重,這個引數本身已經不推薦使用了。
RGB_565:記憶體佔用減少一半,捨棄了透明度,同時三色值也有部分損失,但是圖片失真度很小。
ALPHA_8:記憶體佔用沒有減少!按註釋的解釋個人理解應該是減少3/4的記憶體佔用,而且圖片與ARGB_8888下的沒有區別。
(ALPHA_8查到的資料不多,希望有高手可以幫我解惑)

總結:
由於ARGB_4444不推薦使用和ALPHA_8效果不明。我們大多數是用的還是ARGB_8888和RGB_565。
RGB_565能夠在保證圖片質量的情況下大大減少記憶體的開銷,是解決oom的一種方法。但是一定要注意RGB_565是沒有透明度的,如果圖片本身需要保留透明度,那麼就不能使用RGB_565。

在遊戲應用中,要根據具體的使用要求來進行使用。例如一張地圖,肯定不會出現空白透明的地方,所以可以選用不帶alpha通道的格式。把地圖,改成RGB_565這一類,沒有透明度的圖片,縮小了很多。而人物,肯定會有透明的地方。然後我們還有把一些後期功能,不重要的功能,例如一些小怪,壓縮,從畫素上壓縮。還有圖片重用,在這個副本是大boss,下一個副本是小怪。把60級以後的圖片刪除掉,玩家玩到某個節點的時候,就提示要求玩家點選下載新的包。或者在遊戲過程中,也偷偷下載新的圖片。

相關文章