從矩陣來看顏色變換


基礎知識

之前從矩陣的角度分析了平移,旋轉,縮放,對稱的變換,文章在從矩陣來看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;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章