|--reference
https://www.cnblogs.com/popfisher/p/6959106.html
|--1.顏色模型
|---RGB(ARGB)
RGB色彩模式是工業界的一種顏色標准, 是通過對紅(R), 綠(G), 藍(B)三個顏色通道的變化
以及它們相互之間的疊加來得到各式各樣的顏色的, RGB即是代表紅, 綠, 藍三個通道的顏色,
這個標准幾乎包括了人類視力所能感知的所有顏色, 是目前運用最廣的顏色系統之一。
還有(android)包含透明度Alpha的顏色模型, 即ARGB。

|---YUV
YUV, 分為三個分量, "Y"表示明亮度(Luminance或Luma), 也就是灰度值;
而"U"和"V" 表示的則是色度(Chrominance或Chroma),
作用是描述影像色彩及飽和度, 用於指定像素的顏色。
YUV的原理是把亮度與色度分離, 研究證明, 人眼對亮度的敏感超過色度。
利用這個原理, 可以把色度信息減少一點, 人眼也無法查覺這一點。
主要用於電視系統以及模擬視頻領域, 它將亮度信息(Y)與色彩信息(UV)分離,
沒有UV信息一樣可以顯示完整的圖像, 只不過是黑白的,
這樣的設計很好地解決了彩色電視機與黑白電視的兼容問題
YUV的存儲中與RGB格式最大不同在於, RGB格式每個點的數據是連繼保存在一起的。
即R, G, B是前后不間隔的保存在2-4byte空間中。而YUV的數據中為了節約空間,
U, V分量空間會減小。每一個點的Y分量獨立保存, 但連續幾個點的U, V分量是保存在一起的,
(反正人眼一般也看不出區別).這幾個點合起來稱為macro-pixel, 這種存儲格式稱為Packed格式。
另外一種存儲格式是把一幅圖像中Y, U, V分別用三個獨立的數組表示。這種模式稱為planar模式。

|---CMYK
CMYK也稱作印刷色彩模式, 顧名思義就是用來印刷的。
印刷四分色模式是彩色印刷時采用的一種套色模式, 利用色料的三原色混色原理,
加上黑色油墨, 共計四種顏色混合疊加, 形成所謂"全彩印刷"。四種標准顏色是:
C:Cyan = 青色, 又稱為'天藍色'或是'湛藍'
M:Magenta = 品紅色, 又稱為'洋紅色'
Y:Yellow = 黃色
K:Key(blacK) = 定位套版色(黑色),
有些文獻解釋說這里的K指代Black黑色, 且為了避免與RGB的Blue藍色混淆不用B而改稱,
雖然這是一種有用的助憶, 但事實上這種說法是不正確的。
CMYK和RGB相比有一個很大的不同:RGB模式是一種發光的色彩模式,
在一間黑暗的房間內仍然可以看見屏幕上的內容;CMYK是一種依靠反光的色彩模式,
我們是怎樣閱讀報紙的內容呢?是由陽光或燈光照射到報紙上, 再反射到我們的眼中, 才看到內容。
它需要有外界光源, 如果你在黑暗房間內是無法閱讀報紙的。只要是在印刷品上看到的圖像,
就是CMYK模式表現的。比如期刊, 雜志, 報紙, 宣傳畫等, 都是印刷出來的, 那么就是CMYK模式的了。

|--2.RGB在計算機中顏色值的數字化編碼
在不考慮透明度的情況下, 一個像素點的顏色值在計算機中的表示方法有以下3種:
浮點數編碼:比如float: (1.0, 0.5, 0.75), 每個顏色分量各占1個float字段,
其中1.0表示該分量的值為全紅或全綠或全藍;
24位的整數編碼:比如24-bit:(255, 128, 196), 每個顏色分量各占8位, 取值范圍0-255,
其中255表示該分量的值為全紅或全綠或全藍;
16位的整數編碼:比如16-bit:(31, 45, 31), 第1和第3個顏色分量各占5位, 取值范圍0-31,
第2個顏色分量占6位, 取值范圍0-63;
在Java中, float類型的變量占32位, int類型的變量占32位, short和char類型的變量都在16位,
因此可以看出, 用浮點數表示法編碼一個像素的顏色, 內存占用量是96位即12字節;
而用24位整數表示法編碼, 只要一個int類型變量, 占用4個字節(高8位空着, 低24位用於表示顏色);
用16位整數表示法編碼, 只要一個short類型變量, 占2個字節;因此可以看出采用整數表示法編碼顏色值,
可以大大節省內存,當然, 顏色質量也會相對低一些。在Android中獲取Bitmap的時候一般也采用整型編碼。
|--3.Android中RGB編碼格式(整型編碼)
RGB888(int):R, G, B分量各占8位
RGB565(short):R, G, B分量分別占5, 6, 5位
RGB555(short):RGB分量都用5位表示(剩下的1位不用)
ARGB8888(int):A, R, G, B分量各占8位
ARGB4444(short):A, R, G, B分量各占4位
回想一下Android的BitmapConfig類中, 有ARGB_8888, ARGB_4444, RGB565等常量,
現在可以知道它們分別代表了什么含義。同時也可以計算一張圖片在內存中可能占用的大小,
比如采用ARGB_8888編碼載入一張1920*1200的圖片, 大概就會占用1920*1200*4/1024/1024=8.79MB的內存。
|--4.降低要顯示的圖片色彩質量
采用低內存占用量的編碼方式, 比如Bitmap.Config.ARGB_4444比Bitmap.Config.ARGB_8888更省內存
1920*1200的圖片:
ARGB_8888:1920*1200*4/1024/1024=8.79MB
ARGB_4444, RGB565:1920*1200*2/1024/1024=4.39MB
|--總結
在Android中, 對圖片的使用一定要關注, 大多數情況下, 占用內存多,
OOM發生都是因為圖片資源使用不當。不要盲目加一個大圖到Android項目中,
能使用繪制實現就不要加一個圖片資源。有些時候, 在不影響用戶體驗的情況下,
可以降低圖片素材質量, 比如不需要透明度的就不要, 有些透明度用肉眼看不出來。
eg: 一張圖片占用多少內存(800*600 分辨率 編碼格式:)
1. 圖片占用內存的計算公式:圖片高度 * 圖片寬度 * 一個像素占用的內存大小
2. 圖片占用內存是:800 * 600 * 4 byte = 1875KB = 1.83M
4byte是跟圖片的編碼格式有關系
eg: ARGB: 0xff223344
0xff = alpha,
0x22 = red color,
0x33 = green color,
0x44 = blue color,
|--圖片格式:
1 Webp格式
2 BMP格式
3 PCX格式
4 TIF格式
5 GIF格式
6 JPEG格式
7 TGA格式
8 EXIF格式
9 FPX格式
10 SVG格式
11 PSD格式
12 CDR格式
13 PCD格式
14 DXF格式
15 UFO格式
16 EPS格式
17 AI格式
18 PNG格式
19 HDRI格式
20 RAW格式
21 WMF格式
22 FLIC格式
23 EMF格式
24 ICO格式
eg:
SVG格式
SVG可以算是目前最最火熱的圖像文件格式了, 它的英文全稱為Scalable Vector Graphics,
意思為可縮放的矢量圖形。它是基於XML(Extensible Markup Language),
由World Wide Web Consortium(W3C)聯盟進行開發的。
嚴格來說應該是一種開放標准的矢量圖形語言, 可讓你設計激動人心的, 高分辨率的Web圖形頁面。
用戶可以直接用代碼來描繪圖像, 可以用任何文字處理工具打開SVG圖像,
通過改變部分代碼來使圖像具有交互功能, 並可以隨時插入到HTML中通過瀏覽器來觀看。
eg:在嵌入式設備中常直接將圖片或者繪制圖像寫入到framebuffer中顯示
常見方式為 linuxfb, direct fb(QT)
查看/dev/fbx
