2012-08-07 65 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的源代码可能会有所帮助,但由于这不是一个惊天动地的问题,我会给它一个通行证。