基礎知識
之前從矩陣的角度分析了平移,旋轉,縮放,對稱的變換,文章在從矩陣來看Android中的一些動畫變換。
在android中,圖片的對象主要是bitmap,它是由點陣和顏色值組成的。
1、點陣是一個圖片寬*圖片高的矩陣,矩陣中的每一個元素對應着圖片的一個像素。根據點陣可以計算出圖片佔用的內存大小。
ALPHA_8: 每個像素佔用1byte內存
ARGB_4444: 每個像素佔用2byte內存
ARGB_8888: 每個像素佔用4byte內存
RGB_565: 每個像素佔用2byte內存
圖片佔用內存 = 圖片高度顯示像素 * 圖片寬度顯示像素 * 每個像素佔用的內存大小
顯示像素 = 圖片實際像素 * 手機density / 圖片density
假設有一張長寬爲800*600、通道爲ARGB_8888的圖片,那麼它佔的內存爲:
800*600*4byte = 1875KB = 1.83M
2、顏色值,是由三原色和透明度決定的,即ARGB,分別對應着四個顏色通道,每個通道用8byte定義,所以一個顏色值就是一個int整型,可以表示256x256x256種顏色值。
在android中和顏色有關的幾個常量:ARGB_8888、ARGB_4444、RGB_565。
ARGB_8888,是圖片的透明度、R、G、B的每個顏色值佔8bit,可以表示256x256x256種顏色,也就是可以表示最多的顏色值,圖片質量也是最好的。
ARGB_4444,是圖片的透明度、R、G、B的每個顏色值佔4bit,可以表示16x16x16種顏色,相對ARGB_8888,它節省了空間,卻失去了很多色彩。
RGB_565,它只有R、G、B三個顏色通道,沒有透明度通道,可以表達32x64x32種顏色。
四個顏色通道是由一個4x5的變換矩陣控制的。
顏色矩陣變換
所以,可以知道,紅色通道由第一行控制。
綠色通道由第二行控制。
藍色通道由第三行控制。
透明度通道由第四行控制。
另外的,第五列是每個通道的偏移量。注意倍數和相加的影響,每個通道最後的值不應該大於256.
在android中,有一個和顏色矩陣相關的android.graphics.Matrix類,該類中有與顏色變換相關的方法。
關於Matrix方法的使用這裏就不詳細講了。
實例:
public static Bitmap testBitmap(Bitmap bitmap)
{
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
bitmap.getHeight(), Config.RGB_565);
Canvas canvas = new Canvas(output);
Paint paint = new Paint();
ColorMatrix cm = new ColorMatrix();
float[] array = {1,0,0,0,100,
0,1,0,0,100,
0,0,1,0,0,
0,0,0,1,0};
cm.set(array);
paint.setColorFilter(new ColorMatrixColorFilter(cm));
canvas.drawBitmap(bitmap, 0, 0, paint);
return output;
}