//★ クリックされた座標の色を削除する 前田 稔
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Diagnostics;
public class MyForm : Form
{
Face App;
int xp=0, yp=0;
int val= 30;
public MyForm()
{
BackColor = SystemColors.AppWorkspace;
App = new Face();
float hdpi = App.bmp.HorizontalResolution;
float vdpi = App.bmp.VerticalResolution;
Width = App.bmp.Width;
Height = App.bmp.Height+32;
Debug.Write("Width:" + App.bmp.Width + " Hight:" + App.bmp.Height + " H:" + hdpi + " V:" + vdpi + "\n");
Paint += new PaintEventHandler(MyHandler);
MouseDown += new MouseEventHandler(OnMyMouseDown);
}
private void MyHandler(object sender, PaintEventArgs e)
{
Graphics g;
string str;
g = e.Graphics;
if (App.bmp == null) Application.Exit();
App.View(g,0,0);
if (xp==0) MessageBox.Show("削除する色を選択して下さい");
else
{
str = "v:" + val + " [" + xp + "," + yp + "]";
this.Text = str;
}
}
private void OnMyMouseDown(object sender, MouseEventArgs e)
{ if (e.Button == MouseButtons.Left) //マウスの左ボタン
{ if (xp==0)
{ xp= e.X;
yp= e.Y;
}
else
{ App.LoadImage();
val+= 4;
App.Del_Color(xp,yp,val);
}
}
if (e.Button == MouseButtons.Right) //マウスの右ボタン
{ App.LoadImage();
xp= 0;
val= 30;
}
Invalidate();
}
}
//☆ Face Object Class
class Face
{
public Bitmap bmp = null;
string ImgFile = "";
public Color cor_L;
public Color cor_H;
// Constructor
public Face()
{
OpenFileDialog opendlg = new OpenFileDialog();
opendlg.Filter = "画像ファイル|*.bmp;*.jpg|すべてのファイル|*.*" ;
if (opendlg.ShowDialog() == DialogResult.OK)
{ ImgFile = opendlg.FileName;
bmp = new Bitmap(ImgFile);
}
}
// 画像ファイルの入力
public void LoadImage()
{ bmp = new Bitmap(ImgFile); }
// 画像を描画
public void View(Graphics g, int x, int y)
{ if (bmp != null) g.DrawImage(bmp, x, y); }
// 画像から xp,yp で指定された色を削除する関数
public void Del_Color(int xp, int yp, int wd)
{ if (bmp == null) return;
SetLimit(xp,yp,wd);
for(int y=0; y<bmp.Height; y++)
for(int x=0; x<bmp.Width; x++)
{ if (ChkPic(x,y)) bmp.SetPixel(x,y,Color.Black); }
}
// xp,yp の色を取得して cor_L ~ cor_H に設定する(wd=幅)
public void SetLimit(int xp, int yp, int wd)
{ Color cor;
int r,g,b;
cor = bmp.GetPixel(xp,yp);
r = cor.R-wd;
if (r<0) r= 0;
g = cor.G-wd;
if (g<0) g= 0;
b = cor.B-wd;
if (b<0) b= 0;
cor_L = Color.FromArgb(255,r,g,b);
r = cor.R+wd;
if (r>255) r= 255;
g = cor.G+wd;
if (g>255) g= 255;
b = cor.B+wd;
if (b>255) b= 255;
cor_H = Color.FromArgb(255,r,g,b);
}
// xp,yp のピクセルが cor_L ~ cor_H の範囲かチェックする(範囲内=true)
public bool ChkPic(int xp, int yp)
{ Color cor = bmp.GetPixel(xp,yp);
if (cor.R<cor_L.R || cor.R>cor_H.R) return false;
if (cor.G<cor_L.G || cor.G>cor_H.G) return false;
if (cor.B<cor_L.B || cor.B>cor_H.B) return false;
return true;
}
}
class image01
{
[STAThread]
public static void Main()
{
MyForm mf = new MyForm();
Application.Run(mf);
}
}
|