gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:04:53 24 4
gpt4 key购买 nike

在我的应用程序中,我有一个自定义 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com