1

在我的应用程序中,我有一个自定义视图,它呈现一些位图并使用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)为 RGB_565 ,但当然这在这里没有什么区别。Android在内部做什么?我的推理错误在哪里?red >> 3green >> 2blue >> 3(206,48,49)(200,50,50)

4

1 回答 1

1

终于自己弄清楚了...

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

  1. 在 RGB_565 位图上绘制(200,50,50)(RGB_888)。
  2. 在 RGB_888 画布上绘制 RGB_565 位图。

(200,50,50)等于(25,12,6)RGB_565 ( red >> 3, green >> 2, blue >> 3)。此外,毫不奇怪,(206,48,49)它也在(25,12,6)RGB_565 中。

现在,当您转换(25,12,6)回 RGB_888 时,例如使用此算法,您会得到(206,49,49)- 足够接近。不过,我真的无法解释为什么 Android 会为绿色通道返回 48 而不是 49。也许这是一个舍入误差或浮点不精确。查看 Android 源代码可能会有所帮助,但由于这不是一个惊天动地的问题,所以我会通过它。

于 2014-06-05T00:02:13.770 回答