private void button1_Click(object sender, EventArgs e)
{
// 画像のロード
Bitmap bmp = new Bitmap("path_to_your_image.bmp");
// 指定する色を透明に設定
Color targetColor = Color.White; // 例: 白色を透明にする
bmp.MakeTransparent(targetColor);
// マスク画像を作成(PixelFormat.Format32bppArgbを使用)
Bitmap maskBmp = new Bitmap(bmp.Width, bmp.Height, PixelFormat.Format32bppArgb);
using (Graphics g = Graphics.FromImage(maskBmp))
{
// 元の画像を描画する
g.DrawImage(bmp, 0, 0);
// 彩度を0にするColorMatrixを作成
ColorMatrix colorMatrix = new ColorMatrix(
new float[][]
{
new float[] {0, 0, 0, 0, 0},
new float[] {0, 0, 0, 0, 0},
new float[] {0, 0, 0, 0, 0},
new float[] {0, 0, 0, 1, 0},
new float[] {0, 0, 0, 0, 1}
});
// 画像属性を作成
ImageAttributes attributes = new ImageAttributes();
attributes.SetColorMatrix(colorMatrix);
// マスク画像に透明部分以外を黒に設定
g.DrawImage(maskBmp, new Rectangle(0, 0, maskBmp.Width, maskBmp.Height), 0, 0, askBmp.Width, maskBmp.Height, GraphicsUnit.Pixel, attributes);
}
// 結果画像を作成(元画像にマスク画像を重ねる)
Bitmap resultBmp = new Bitmap(bmp.Width, bmp.Height, PixelFormat.Format32bppArgb);
using (Graphics g = Graphics.FromImage(resultBmp))
{
// 元の画像を描画
g.DrawImage(bmp, 0, 0);
// マスク画像を重ねる
g.DrawImage(maskBmp, 0, 0);
}
// PictureBoxに結果画像を表示
pictureBox1.Image = resultBmp;
}
処理のご提案ありがとうございます。
画像を拝見しました。
なるほど、これはネイティブの人でも読み辛そうですね・・・。
いくつか質問させてください。
こちらで前に試した時は前に書いた通り、巻き込む色を増やすと激重になりました。
そして、添付された画像を見る限り、白色部分はアンチエイリアスの影響で単色ではないように思います。
貼って頂いたソースでは、マスクしている色、即ち「targetColor」は白の単色(255,255,255)ですが、これはちゃんと動作するのでしょうか?
巻き込む色を全てマスクする場合、重くなるのではないかと懸念しています。
ご提示頂いたソースでは彩度を0(黒)にしていますが、これは色置換の逆ではなく処理としては「指定した色以外を全て黒色に置換する」となっています。
仮に黒色(またはそれに近しい色)をマスクした時、彩度を0にする方法だと処理後の画像は真っ黒になりそうな気がします。
これについて何か解決方法はありますか?
最後に、PCOTはC#で組んでいるのでご提示頂いたソースはそのまま流用可能です。
ありがとうございます。
書き込みに関しては全く不快だとは思いません。解決方法までご提示頂けて感謝の気持ちで一杯です。
PCOTは当初自分で使う目的で突貫工事で作ったツールで、大半は一人であれこれ悩んで実装してきたので、こうしてコードベースで一緒に考えてくれる人がいるのは大変心強いです。