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

Android:如何在View.onDraw()中使用RGB_565颜色匹配位图颜色,android,view,colors,bitmap,rgb,Android,View,Colors,Bitmap,Rgb,在我的应用程序中,我有一个自定义视图,它渲染一些位图,并使用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

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


我尝试通过删除最低有效位(
红色>>3
绿色>>2
蓝色>>3
),将
(200,50,50)
转换为RGB_565,但这当然没有什么区别。Android在内部是如何从
(200,50,50)
获取
(206,48,49)
?我的推理错误在哪里?

我自己终于明白了

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

  • 在RGB_565位图上绘制
    (200,50,50)
    (RGB_888)
  • 在RGB_888画布上绘制RGB_565位图
  • (200,50,50)
    等于RGB_565中的
    (25,12,6)
    红色>>3,绿色>>2,蓝色>>3
    )。此外 毫不奇怪,
    (206,48,49)
    在RGB_565中也是
    (25,12,6)


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

    最终我自己解决了这个问题

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

  • 在RGB_565位图上绘制
    (200,50,50)
    (RGB_888)
  • 在RGB_888画布上绘制RGB_565位图
  • (200,50,50)
    等于RGB_565中的
    (25,12,6)
    红色>>3,绿色>>2,蓝色>>3
    )。此外 毫不奇怪,
    (206,48,49)
    在RGB_565中也是
    (25,12,6)

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