1

私のアプリケーションには、いくつかのビットマップをレンダリングし、を使用してそれらをビューのキャンバスに描画するカスタムビューがあります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)ます。

明らかに、これはARGB_8888の代わりにRGB_565を使用するビットマップに関係している必要があります(私は使用したくありません)。だから私の質問は、これらの色の問題を回避するために、ビューのキャンバスをRGB_565色で塗りつぶすにはどうすればよいですか?

(200,50,50)最下位ビット(、、)を削除してRGB_565にred >> 3変換しようとしましたがgreen >> 2blue >> 3もちろんここでは違いはありません。Androidは内部で何を取得(206,48,49)(200,50,50)ますか?推論の誤りはどこにありますか?

4

1 に答える 1

1

最後にこれを自分で理解しました...

私のonDraw()方法では、2 つの暗黙的な色空間変換があります。

  1. (200,50,50)RGB_565 ビットマップに (RGB_888) を描画します。
  2. RGB_888 キャンバスに RGB_565 ビットマップを描画します。

(200,50,50)(25,12,6)RGB_565 ( red >> 3, green >> 2, blue >> 3) と同じです。また、当然のことながら、RGB_565 に(206,48,49)もあります。(25,12,6)

たとえば、このアルゴリズム(25,12,6)を使用して RGB_888 に戻すと、十分に近くなります。ただし、Android が緑のチャネルに対して 49 ではなく 48 を返す理由を説明することはできません。たぶん、丸めエラーまたは浮動小数点の不正確さです。Android のソースを見ると役立つかもしれませんが、これは大した問題ではないので、パスします。(206,49,49)

于 2014-06-05T00:02:13.770 に答える