1

非常に単純なはずの何かに問題があります。1% の不透明なボックスを重ねてペイントしています。100 回のペイントの後、不透明度は 100% に達すると予想されますが、不透明度 (アルファ値) は 100% 未満に収束し、増加しなくなります。この問題を示すために、コードを次のように単純化しました。

    BufferedImage bi = new BufferedImage(10, 10, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2 = bi.createGraphics();

    float alpha = 0.01f;
    Color c = new Color(1.0f, 1.0f, 1.0f, alpha);
    g2.setColor(c);

    while (true) {
        g2.fillRect(0, 0, 10, 10);
        System.out.println(new Color(bi.getRGB(5, 5), true).getAlpha() / 255f);
        Thread.sleep(50);
    }

0.01 のアルファ (不透明度 1%) で塗りつぶされた白いボックスを互いに重ねて描画し、描画領域の中心のアルファが何であるかをテストします。これは、0%、1%、2%、3% ... 100% のように増加するはずだと思いました。ただし、代わりにゆっくりと 83.5% に収束し、奇妙に増加しなくなります。これは AlphaComposite に関係していると思いますが、単純な線形 alphaNEW = alphaDST + alphaSRC 操作を成功させる方法を無限に見つけようとしました。ただし、0.5 以上のアルファは中心で 1.0 に達しますが、私が望むほど直線的ではありません。すべてのコンポジットは、ソースピクセルと宛先ピクセルに「アルファ」および/または「1 - アルファ」という形式を使用しているようです...アイデアはありますか?

乾杯 :)

編集:私が達成しようとしているのは、線形(1%、2%、3%の不透明度...)であり、最終的に1%の不透明ペイントで同じ領域を何度もペイントした場合のPhotoshopの動作と似ていません不透明度 100% に達し、80% で止まらない!

4

1 に答える 1

1

アルファ堆肥化は、デフォルトでは「追加的」ではありません。通常、最終的なアルファは「in」演算子として計算されます。wikiには、これに関する詳細情報があります。ただし、追加の堆肥化が必要な場合は、独自のカスタム堆肥化機能を実装する必要がある場合があります。

于 2013-09-30T17:04:54.677 に答える