วันอังคารที่ ๒๐ ตุลาคม พ.ศ. ๒๕๕๒

Debugging in Dev-C++

Dev-c++ สนับสนุนการดีบักโปรแกรมภาษาซี ซีพลัสพลัส โดยมีขั้นตอนดังนี้

1. กำหนดค่าให้ linker สร้างข้อมูลการดีบัก โดยเลือกเมนู Tools/Compiler Options/Settings/Linker/Generate Debugging Information

ซึ่้งขั้นตอนนี้จะต้องทำเพียงครั้งแรกครั้งเดียวเท่านั้น

2. ทดลองสร้างโปรแกรมตัวอย่าง แล้วคลิกที่จุดที่ต้องการสร้าง Breakpoint โดยคลิกที่ขอบทางซ้ายมือ

3. คอมไพล์โปรแกรมใหม่อีกครั้ง
4. จากนั้นเลือกเมนู Debug/Run to cursor
5. ในขณะนี้จะอยู่ในกระบวนการดีบัก เราสามารถดูค่าของตัวแปรใดๆได้ หรือเปลี่ยนค่าของตัวแปร หรือกำหนดนิพจน์ใหม่ได้ ในที่นี้เราจะลองดูค่าของตัวแปรโดยการเลื่อนเมาส์ไปวางที่ตัวแปรที่สนใจในโปรแกรม ซึ่ง Dev-c++ จะ Add watch ชื่อตัวแปรนี้โดยอัตโนมัติ


6. จากนั้นเราสามารถเลือก Debug/Next step เพื่อดีบักแต่ละขั้นตอนของโปรแกรม พร้อมๆกันดูค่าของตัวแปรที่สนใจได้
7. สามารถหยุดการดีบัก โดยเลือกเมนู Debug/Stop execution

วันเสาร์ที่ ๒๑ มิถุนายน พ.ศ. ๒๕๕๑

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 function uses GetPixel and SetPixel which are very easy but quite slow, and only applicable to RGB image
//*********************************
public static void InvertSlow(Bitmap bmp)
{
// Image width and height
int w = bmp.Width;
int h = bmp.Height;
// Color
Color CL1,CL2;
for (int y = 0; y < h; y++)
{
for (int x = 0; x < w; x++)
{
// get pixel color
CL1 = bmp.GetPixel(x,y);
// change to negative
CL2 = Color.FromArgb(255 - CL1.R, 255 - CL1.G, 255 - CL1.B);
// set pixel to new color
bmp.SetPixel(x, y, CL2);
}
}
}

เสร็จแล้วครับ หากจะเรียกใช้งานฟังก์ชันนี้จากฟอร์มหลัก อย่าลืมใช้คำสั่ง 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);
}


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