3

を使用して画像の透過マスクを描画する (つまり、すべての可視ピクセルを一定の色でペイントする) ことは可能Graphics::DrawImageですか? 画像をピクセルごとに手動でスキャンして別のマスク画像を作成することを探しているわけではありません。元の画像から直接マスク画像を描画できるかどうか疑問に思っています。

私の推測ではImageAttributes、可能であれば、特定の操作で行う必要があります。

マスクの色は任意で正確である必要があり、透明度のしきい値があればプラスになります。

4

2 に答える 2

1

ピクセルごとのアルファ マスクを使用して画像を描画する必要があり、ベース RGB 画像を描画してから、アルファ マスクの不透明部分を上に描画するのが最善の方法であることがわかりました。各アルファ レベルをアルファ レベル + カラーにマッピングして、アルファ マスクのすべての詳細をイメージに反映させる必要があります。私が持っているコードには、別の 8 ビット イメージとしてアルファ マスクがありますが、描画コードは次のようになります。

g.DrawImage(&picture, r.left, r.top, r.Width(), r.Height()); // base image      

if ( AlphaBuf != NULL ) // do we have and alpha mask?
{
Gdiplus::Bitmap mask(Width, Height, Width(), PixelFormat8bppIndexed, AlphaBuf);
picture.GetPalette( palette, picture.GetPaletteSize() );
    // invert - only shows the transparent  
palette->Entries[0] = DLIMAKEARGB(255, 0, 0, 200); // 0 = fully transparent
palette->Entries[255] = DLIMAKEARGB(0, 0, 0, 0); // 255 = fully opaque 

mask.SetPalette(palette);
g.DrawImage(&mask, r.left, r.top, r.Width(), r.Height()); // draw the mask 
}

私のアルファマスクは完全に透明または完全に不透明ですが、パレットで他のアルファ値を設定すると、より段階的なマスクに従うことができると思います.

palette->Entries[1] = DLIMAKEARGB(254, 0, 0, 200);
palette->Entries[2] = DLIMAKEARGB(253, 0, 0, 200);
etc..

これが役立つことを願っています(または少なくとも意味があります:-p)

于 2009-11-12T12:04:07.120 に答える