2012-08-07 99 views
1

在我的應用程序中,我有一個自定義視圖,它呈現一些位圖並使用onDraw()將它們繪製到視圖的畫布上。畫布首先填充顏色。基本上我有以下代碼:Android:如何在View.onDraw()中使用RGB_565顏色來匹配位圖顏色

public static int COLOR = Color.rgb(200, 50, 50); 

@Override 
public void onDraw(Canvas canvas) { 
    canvas.drawColor(COLOR); 

    Bitmap bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.RGB_565); 
    Canvas c = new Canvas(bitmap); 
    c.drawColor(COLOR); 

    canvas.drawBitmap(bitmap, 0, 0, null); 
} 

我期待代碼創建一個連續的紅色屏幕;位圖呈現在不同的紅色陰影中,所以它的位置是可見的。分析顏色我做了一個截圖 - 位圖是用(206,48,49)而不是(200,50,50)繪製的。

很明顯,這必須與使用RGB_565而不是ARGB_8888(我不想使用它)的位圖有關。所以我的問題是,我如何用RGB_565顏色填充視圖的畫布以解決這些顏色問題?

我試圖通過降低至少顯著位(red >> 3green >> 2blue >> 3)轉換(200,50,50)到RGB_565,但當然不會在這裏做一個區別。 Android在內部從(200,50,50)獲得(206,48,49)是什麼?我在推理中的錯誤在哪裏?

回答

1

終於想通了這一點自己...

在我onDraw()方法有兩個隱含的色彩空間轉換:

  1. 繪製(200,50,50)(RGB_888)上RGB_565位圖。
  2. 在RGB_888畫布上繪製RGB_565位圖。

(200,50,50)等於在RGB_565 (25,12,6)red >> 3, green >> 2, blue >> 3)。另外, 也就不足爲奇了,(206,48,49)也是RGB_565中的(25,12,6)

現在,當您將(25,12,6)轉換回RGB_888時,使用this algorithm,您會得到(206,49,49) - 足夠接近。不過,我真的無法解釋爲什麼Android爲綠色通道返回48而不是49。也許這是一個舍入錯誤或浮點不精確。看看Android的源代碼可能會有所幫助,但由於這不是一個驚天動地的問題,我會給它一個通行證。