| 余り見ない現象だな、と思ってペイントソフトで例示されている画像を調べました。 Save後に水色の矩形で塗りつぶされる部分(のうち元々は透明部分)は、A=0,R=76,G=132,B=176となっています。矩形外の部分はA=0,R=255,G=255,B=255でした。 Aが0なので元画像単体で見た場合は矩形部分は完全透過されて表示されますが、BmpBitmapEncoderは、単純にAの値を無視しているようです。なので、BmpBitmapEncoderで保存された画像は、元画像ではA=0のために見えていなかった水色が表に出てくる、ということのようです。
対策としては、System.Drawingと同様に一旦ビットマップを新しいビットマップに描画する、という方法でしょうか。 System.Windows.Media.Imagingでは、以下のような手順で実施します。 1. RenderTargetBitmapをnewする。 ※PixelFormatはPixelFormats.Defaultぐらいしか有効ではない。 2. DrawingVisualをnewする。 3. DrawingVisualのRenderOpen()を呼び出してDrawingContextを取得する。 4. DrawingContextを使い、まずDrawRectangle()で背景色を塗りつぶし、その後DrawImage()で元画像を描画する。 ※描画時のwidth, heightは元画像のPixelWidth/PixelHeightではなく元画像のWidth/Heightを使用する。 5. DrawingContextをCloseする(usingでよい)。 6. RenderTargetBitmapのRender()でDrawingVisualを指定する。 |