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);
}
}
出来ました。
コメント