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

标签 android view colors bitmap rgb

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

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 颜色填充 View 的 Canvas 以解决这些颜色问题?

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

最佳答案

终于自己想通了...

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

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

(200,50,50) 等于 RGB_565 中的 (25,12,6)(red >> 3,green >> 2,蓝色 >> 3)。除了, 毫不奇怪,(206,48,49) 在 RGB_565 中也是 (25,12,6)

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

关于Android:如何在 View.onDraw() 中使用 RGB_565 颜色来匹配位图颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11852656/

相关文章:

android - 嵌套 View 未呈现

Java颜色检测

Javascript - 检查字符串是否是有效的 CSS 颜色?

android - 在 MVVM 中处理昂贵的、特定于 View 的对象的最佳实践

android - 为什么我的线程会卡住 UI 线程?

android - 什么是我的应用程序强制关闭?线程有一些错误。但我无法弄清楚?

sql - 包含 UNION 的 MySQL View 优化得不好……换句话说,很慢!

sql-server - SQL 中 View 的性能

c++ - HSB vs HSL vs HSV

java - 扩展输入的 EditText 宽度