在我的应用程序中,我有一个自定义 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 >> 3
, green >> 2
, blue >> 3
)到 RGB_565,当然这在这里没有区别。 Android 内部做了什么来获得 (206,48,49)
来自 (200,50,50)
?我的推理错误在哪里?
最佳答案
终于自己想通了...
在我的onDraw()
方法中,有两个隐式颜色空间转换:
- 在 RGB_565 位图上绘制
(200,50,50)
(RGB_888)。 - 在 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/