Android:如何在View.onDraw()中使用RGB_565颜色来匹配位图颜色

时间:2012-08-07 19:21:51

标签: android view colors bitmap rgb

在我的应用程序中,我有一个自定义视图,它使用onDraw()渲染一些位图并将它们绘制到视图的画布上。画布首先填充颜色。基本上我有以下代码:

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颜色填充视图的画布以解决这些颜色问题?

我尝试通过删除最低有效位((200,50,50)red >> 3green >> 2)来将blue >> 3转换为RGB_565,但当然这在这里没有任何区别。 Android内部从(206,48,49)获取(200,50,50)的内容是什么?我的推理错误在哪里?

1 个答案:

答案 0 :(得分:1)

最后我自己想出来了......

在我的onDraw()方法中,有两种隐式颜色空间转换:

  1. 在RGB_565位图上绘制(200,50,50)(RGB_888)。
  2. 在RGB_888画布上绘制RGB_565位图。
  3. (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源可能有所帮助,但由于这不是一个惊天动地的问题,我会给它一个通行证。