ピクセルごとのアルファ マスクを使用して画像を描画する必要があり、ベース 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)