private void button1_Click(object sender, EventArgs e)
{
// 画像のロード
Bitmap wkBmp = new Bitmap("D:\work\test2.png");
// 指定する色を透明に設定
Color targetColor = Color.FromArgb(255, 136, 0); // 例: 橙色を透明にする
wkBmp.MakeTransparent(targetColor);
// マスク用画像オブジェクトを作成(PixelFormat.Format32bppArgbを使用)
Bitmap maskBmp = new Bitmap(wkBmp.Width, wkBmp.Height, PixelFormat.Format32bppArgb);
using (Graphics g = Graphics.FromImage(maskBmp))
{
// 元の画像(橙文字部分が透明)を描画する
g.DrawImage(wkBmp, 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}
});
//もし文字色が黒なら、背景は赤色にする。
if (false)
{
colorMatrix = new ColorMatrix(
new float[][]
{
new float[] { 1, 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[] { 1, 0, 0, 0, 1 }
});
}
// 画像属性を作成
ImageAttributes attributes = new ImageAttributes();
attributes.SetColorMatrix(colorMatrix);
// マスク画像に透明部分以外を黒(or赤)に設定
g.DrawImage(maskBmp, new Rectangle(0, 0, maskBmp.Width, maskBmp.Height), 0, 0, maskBmp.Width, maskBmp.Height, GraphicsUnit.Pixel, attributes);
}
// 結果画像を作成(元画像にマスク画像を重ねる)
Bitmap resultBmp = new Bitmap(wkBmp.Width, wkBmp.Height, PixelFormat.Format32bppArgb);
using (Graphics g = Graphics.FromImage(resultBmp))
{
// オリジナル画像のロード
Bitmap orgBmp = new Bitmap("D:\work\test2.png");
// オリジナル画像を描画
g.DrawImage(orgBmp, 0, 0);
// マスク画像を重ねる(橙文字部分が透明、その他の背景部分は黒(or赤)に変換済み)
g.DrawImage(maskBmp, 0, 0);
}
// PictureBoxに結果画像を表示
pictureBox1.Image = resultBmp;
}
③橙色以外を黒に変換
の部分は「画像加工&OCR読み取り設定」にて「文字色以外は消去」という選択項目を追加します。
文字色を指定(画像から色を抽出)させて追加ボタンを押させる形なので、既存のUIを踏襲できると思います。
重ねてご提案を頂き、ありがとうございます。
理解として正しいかどうかちょっと不安ですが・・・
1.現行のPCOTにある色置換で文字色を単色にする(アンチエイリアスを潰す)
2.単色にした文字色のマスクを作成
3.背景を黒にする
という理解で合っていますか?
単色以外を置換する方法であれば、今のアルゴリズムで判定を反転させるだけでも十分実用的な速度になると思います。
単色+色距離(10~100)とすると、凄まじく重くなるのが問題です。
単色以外を置換で機能的に必要十分ということであれば「色1以外を色2に置換」の方が文字色を判定する必要がないので、実装する私も使用するはまさんも楽だと思うのですが、いかがでしょうか?
はい、その理解大丈夫です。
私はPG構造を知らないので目的のことがもっと簡単にできるのであればその手段のほうが適切だと思います。エンドユーザーにとってPG構造は意識するところではなく、使い勝手がすべてですので。
「色1以外を色2に置換」 この表現はいいですね。ユーザーにとってより理解しやすいと思います。
実装を楽しみにしております。