【问题标题】:Android: How to use RGB_565 colors in View.onDraw() to match bitmap colorsAndroid:如何在 View.onDraw() 中使用 RGB_565 颜色来匹配位图颜色
【发布时间】:2012-08-04 20:42:33
【问题描述】:

在我的应用程序中,我有一个自定义视图,它呈现一些位图并使用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 颜色填充视图的画布以解决这些颜色问题?

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

【问题讨论】:

    标签: android view colors bitmap rgb


    【解决方案1】:

    终于自己搞定了……

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

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

    【讨论】:

      猜你喜欢
      • 2021-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多