Saturday, June 21, 2008

Image Processing ด้วย C# 2

คราวนี้เราจะลองมาดูวิธีการเข้าถึง pixel ของรูปบ้าง ซึ่งโดยทั่วไปมีสามวิธีคือ
  1. ใช้ฟังก์ชัน Bitmap.GetPixel และ Bitmap.SetPixel วิธีนี้จะง่ายที่สุด แต่มีข้อจำกัดคือ ใช้ได้กับรูปที่เป็นแบบ RGB เท่านั้น และ การประมวลผลค่อนข้างช้า
  2. ใช้ pointer เข้าไปจัดการกับค่าของ pixel ในหน่่วยความจำโดยตรง ข้อดีคือเป็นวิธีที่เร็วที่สุด แต่ถือว่าเป็น unsafe code ก่อนคอมไพล์ต้องไปกำหนดรูปแบบให้ยอมรับ unsafe code ด้วย
  3. ทำการสำเนาค่าค่าของ pixel ในหน่่วยความจำ มาเก็บไว้ในตัวแปรชุด จากนั้นก็ประมวลผลค่าของ pixel ให้เสร็จเรียบร้อย จึงค่อยสำเนาค่าตัวแปรชุด กลับไปทับค่าของ pixel ในหน่่วยความจำ
วันนี้เราจะลองใช้วิธีแรกครับ
เป้าหมาย
สร้างฟังก์ชันในการกลับสี (Invert, Negative)


เมื่อ Invert เสร็จ


หลักการ
การ Invert ก็คือการนำค่าสูงสุดของสี มาหักลบด้วยค่าของ pixel นั้น เช่น
p = 255 - p

รหัสโปรแกรมก็จะเป็นประมาณนี้ครับ


เสร็จแล้วครับ หากจะเรียกใช้งานฟังก์ชันนี้จากฟอร์มหลัก อย่าลืมใช้คำสั่ง this.Invalidate() เพื่อให้ฟอร์มรีเฟรชด้วยนะครับ

Image Processing ด้วย C# 1

ในบทแรกนี้เราจะทำการเปิดไฟล์ภาพแล้วแสดงผล
เป้าหมาย



ขั้นตอน
สมมติว่าเราสร้างเมนูเรียบร้อยแล้ว

1. ประกาศตัวแปรสำหรับเก็บภาพ เป็นตัวแปรคลาส
private Bitmap bmp;

2. ในส่วนของเมนู Open ให้เพิ่มรหัสโปรแกรมดังนี้
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
 //Call open dialog
 OpenFileDialog openFileDialog = new OpenFileDialog();
 // Default Initial directory
 openFileDialog.InitialDirectory = "c:\\";
 // File type filter
 openFileDialog.Filter = "Bitmap files (*.bmp)|*.bmp|Jpeg files (*.jpg)|*.jpg|PNG files (*.png)|*.png|All valid files (*.bmp/*.jpg/*.png)|*.bmp/*.jpg/*.png";
 // Set png to be a default format
 openFileDialog.FilterIndex = 3;
 openFileDialog.RestoreDirectory = true;
  
 // if click OK to open image
 if (DialogResult.OK == openFileDialog.ShowDialog())
 {
  // Load bitmap from file
  bmp = (Bitmap)Bitmap.FromFile(openFileDialog.FileName, false);
  // set width and height of form, compensate for menubar
  this.Width = bmp.Width + 5;
  this.Height = bmp.Height + 55;
  // invoke paint method
  this.Invalidate();
 }
}

3. เพิ่ม Event ชื่อ Paint ให้กับฟอร์ม
แล้วเพิ่มรหัสโปรแกรมดังนี้
private void Form1_Paint(object sender, PaintEventArgs e)
{
 // if image file does not exist
 if (bmp == null)
 return;
  
 // else draw image to form
 Graphics g = e.Graphics;
 Rectangle r = new Rectangle(0, 25, bmp.Width, bmp.Height);
 g.DrawImage(bmp, r);
}

เรียบร้อยแล้วครับ

Friday, June 13, 2008

จัดการกับ radioButton หลายๆอัน

ถ้าใช้ radioButton หลายๆอันในฟอร์ม

เบื่อไหมครับที่จะต้องเขียนโค้ด เช่น
if(radioButton1.Checked)
.....
else if(radioButton2.Checked)

.....

ลองใช้วิธีนี้ไหมครับ
ให้คลิกที่ radioButton อันแรก จากนั้นกดแป้น Ctrl ค้างไว้แล้วคลิก radioButton ที่เหลือ
จากนั้นก็เลือก Event ชื่อ CheckedChanged แล้วพิมพ์ชื่อ radioChange แล้วกดแป้น Enter

ที่เหลือก็แก้ไขรหัสโปรแกรมดังนี้ครับ
string sradio;

public Form1()
{
 InitializeComponent();
}

private void radioChange(object sender, EventArgs e)
{
 //cast sender object to radiobutton
 RadioButton radioFood = (RadioButton)sender;
 if (radioFood.Checked)
 sradio = radioFood.Text;
}

private void bttOK_Click(object sender, EventArgs e)
{
 MessageBox.Show("คุณเลือก "+sradio,"รายการที่คุณเลือก",MessageBoxButtons.OK, MessageBoxIcon.Information);
}

ตรวจสอบการป้อนข้อมูลด้วย Validation (2)

ในตัวอย่างที่แล้ว http://surapongu.blogspot.com/2008/06/validation.html
เราได้ตรวจสอบการป้อนข้อมูล แล้วแสดงผลเตือนด้วย MessageBox

ยังมีคอนโทรลอีกตัวหนึ่งที่สามารถใช้ได้ในกรณีนี้ คือ


ทดลองเปิดโปรเจคเดิม แล้วดับเบิลคลิกที่คอนโทรลตัวนี้ มันจะไม่แสดงผลออกมาบนฟอร์มโดยตรง แต่ปรากฎอยู่ข้างใต้แทน

จากนั้นให้แก้โค้ดในบรรทัดที่แสดงผลข้อผิดพลาด จาก
MessageBox.Show("กรุณาป้อนตัวเลขเท่านั้น");

เป็น
errorProvider1.SetError(txtInput, "กรุณาป้อนตัวเลขเท่านั้น");

โดยที่ errorProvider1 เป็นชื่อของคอนโทรล errorProvider

ผลลัพธ์ที่ได้ เมื่อป้อนข้อมูลผิดพลาด จะเกิดปุ่มสีแดงกะพริบเตือนข้างๆ textBox

เลือกใช้ตามใจชอบครับ

ตรวจสอบการป้อนข้อมูลด้วย Validation

เราสามารถตรวจสอบข้อมูลที่ป้อนเข้าไปใน textBox ได้โดยใช้ event ที่ชื่อว่า validating
ตัวอย่าง

โปรแกรมนี้จะตรวจสอบการป้อนค่าตัวเลข ซึ่ง ค่าที่ป้อนจะต้อง
  • เป็นตัวเลขจำนวนเต็มเท่านั้น
  • ต้องมีค่าตั้งแต่ 1-10 เท่านั้น
ถ้าป้อนไม่ถูกจะแสดงผลดังนี้

แต่ถ้าป้อนถูกตามเงื่อนไข ก็จะแสดงผล


รหัสโปรแกรมก็จะเป็นดังนี้

int num;
public Form1()
{
 InitializeComponent();
}

private void txtInput_Validating(object sender, CancelEventArgs e)
{ 
 //validate input
 //if integer
 if (int.TryParse(txtInput.Text, out num))
 {
  if (num<1>10)
  {
   e.Cancel = true; //ยกเลิกทุกเหตุการณ์ถ้าไม่ผ่าน validation เช่นไม่สามารถปิดฟอร์มได้
   MessageBox.Show("กรุณาป้อนเลข 1-10");
  }
 }
 else
 {
  e.Cancel = true;
  MessageBox.Show("กรุณาป้อนตัวเลขเท่านั้น");
 }
}

private void bttOK_Click(object sender, EventArgs e)
{
 MessageBox.Show("คุณป้อนเลข " + num);
}

ไม่ยากใช่ไหมครับ สำหรับการ validate ข้อมูล