C#で画像の白色を透明にする

C# コンピュータ
C#

ImageAttributes.SetRemapTableに変更前後の色をColorMapにセットしてGraphics.DrawImageで描画すると色を入れ替えることが出来ます。
変更前に不透明の白、変更後に透明の白をセットすることで、白を透明化することが出来るのでは?と思い試してみました。

// 
// 白を透明にする
// 
using System;
using System.Drawing;
using System.Drawing.Imaging;

// コンパイル
// csc GrayToClear.cs

class Prog {

    // 32bitARGBに変換    
    static Bitmap To32bppArg(Bitmap bmp) {

        if (bmp.PixelFormat == PixelFormat.Format32bppArgb) return bmp;

        var bmp2 = new Bitmap(bmp.Width, bmp.Height, PixelFormat.Format32bppArgb);

        using(var g = Graphics.FromImage(bmp2)){
            g.PageUnit = GraphicsUnit.Pixel;
            g.DrawImageUnscaled(bmp, 0, 0);
        };

        return bmp2;
    }

    // 白を透明にする
    // inBmpはFormat32bppArgb
    static Bitmap WhiteToClear(Bitmap inBmp) {
        var outBmp = new Bitmap(inBmp.Width, inBmp.Height, PixelFormat.Format32bppArgb);

        using(var g = Graphics.FromImage(outBmp)) {
            ColorMap[] cms = new ColorMap[] {new ColorMap()};
            cms[0].OldColor = Color.FromArgb(255,255,255,255);
            cms[0].NewColor = Color.FromArgb(  0,255,255,255);

            ImageAttributes ia = new ImageAttributes();
            ia.SetRemapTable(cms);

            g.DrawImage(
                inBmp, 
                new Rectangle(0, 0, inBmp.Width, inBmp.Height),
                0, 0,
                inBmp.Width, inBmp.Height,
                GraphicsUnit.Pixel,
                ia
            );
        };

        return outBmp;
    }

    // エントリポイント
    static void Main() {
        var path = @"H:\csharp\OpenCV\00184.png";
        var bmp = To32bppArg(new Bitmap(path));

        bmp = WhiteToClear(bmp);

        Console.WriteLine("{0}",bmp.PixelFormat);

        bmp.Save(@".\00184.png", System.Drawing.Imaging.ImageFormat.Png);
    }
}

出来ました。

コメント