在我的应用程序中,我有一个自定义视图,它使用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 >> 3
,green >> 2
)来将blue >> 3
转换为RGB_565,但当然这在这里没有任何区别。 Android内部从(206,48,49)
获取(200,50,50)
的内容是什么?我的推理错误在哪里?
答案 0 :(得分:1)
最后我自己想出来了......
在我的onDraw()
方法中,有两种隐式颜色空间转换:
(200,50,50)
(RGB_888)。 (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源可能有所帮助,但由于这不是一个惊天动地的问题,我会给它一个通行证。