4

私が遭遇したすべてのアンチエイリアス線描画アルゴリズムは、ピクセルの「強度」は、線が通過する量の関数である必要があると単純に言っています。これは、一定の背景 (つまり、白) では問題なく動作しますが、任意の複雑さの背景に描画できるようにしたいと考えています。これは、強度を透明度に置き換え、線を背景とアルファ ブレンドすることを意味します。

これを行うと、背景が何であるかに応じて必然的に線の色が変わります.1px の線の場合、1 つのピクセルを正確に通過することはめったになく、完全に不透明になるためです。元の色の外観を維持しながら、これらのブレンドされた線を描くためのテクニックがあるかどうかが気になります。

カラフルな背景でレンダリングを試みた例を次に示します。垂直/水平線は実際の色で特別なケースとして描画され、アンチエイリアス処理された対角線は青みがかっていることに気付くでしょう。

ここに画像の説明を入力

適切な線の色の外観を維持しながら、アンチエイリアス処理された線を背景にブレンドする適切な方法はありますか?

編集:実際にポイントをプロットするためのコード:

// Plot pixel at (x,y) with color at transparency alpha [0,1]
static inline void plot(pixel_t *pixels, uint16_t stride, const pixel_t &color, uint16_t x, uint16_t y, uint8_t alpha) {
    pixel_t pix = pixels[y*stride+x];
    pixels[y*stride+x].r = (uint16_t)color.r * alpha/255 + pix.r * (255 - alpha) / 255;
    pixels[y*stride+x].g = (uint16_t)color.g * alpha/255 + pix.g * (255 - alpha) / 255;
    pixels[y*stride+x].b = (uint16_t)color.b * alpha/255 + pix.g * (255 - alpha) / 255;
} 

編集:将来の世代のために、緑と青をブレンドすると、線に青みがかった色合いを与えることができます.

4

1 に答える 1

2

コードのバグを見つけてよかったです。

注意すべきもう 1 つの問題は、ガンマ補正です。正しく見えるようにするには、アンチエイリアシングをリニア カラー スペースに適用する必要がありますが、ほとんどの場合、いくつかの処理手順を節約するために、代わりにガンマ補正されたカラー スペースに適用されます。効果はあなたの例よりもはるかに微妙です。

于 2012-05-21T03:58:06.517 に答える