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

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);
}


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

วันพฤหัสบดีที่ ๑๒ มิถุนายน พ.ศ. ๒๕๕๑

จัดการกับ 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 ข้อมูล

สร้างปุ่มกดด้วย Inkscape (2)

ต่อจากของเดิม
http://surapongu.blogspot.com/2008/06/inkscape.html

เราจะเพิ่มการตกแต่งสักหน่อย โดยอ้างอิงจากรูปนี้

ขั้นตอน
1. สร้างรูปให้ได้ตามกำหนด
2. Duplicate พื้นสีน้ำเงิน เปลี่ยนเป็นสีขาว กำหนดไล่สีจากสว่างมากไปสว่างน้อย แล้วลากไปวางไว้ที่ส่วนบนของปุ่ม ขั้นตอนนี้อาจต้องลองผิดลองถูกจนกว่าจะได้สีตามต้องการ
3. Duplicate พื้นสีน้ำเงิน เปลี่ยนเป็นสีขาว กำหนด blur ให้สูงๆ ลากมาวางที่ส่วนล่างของปุ่ม

4. เอาตัวหนังสือมาวาง ก็เสร็จเรียบร้อยครับ

5. ลองปรับเงาให้ไปอยู่ข้างใต้แทน โดยย้ายเงาเดิมออกมา ปรับขนาดให้เล็กลง แล้วเปลี่ยนค่า blur กับ opacity ก็จะได้รูปแบบที่ต่างออกไป

เสร็จแล้วครับ ลองเอาไปปรับเปลี่ยนได้

ขอบคุณมากๆครับ กับบทความต้นฉบับ http://howto.nicubunu.ro/shiny_web_buttons_inkscape/

สร้างปุ่มกดด้วย Inkscape

อ้างอิงจาก
http://howto.nicubunu.ro/shiny_web_buttons_inkscape/

วันนี้เราจะลองสร้างปุ่มกดสำหรับเว็บด้วย Inkscape แบบนี้ครับ

ขั้นตอน
1. เรียกโปรแกรม Inkscape (ดาวน์โหลดได้ฟรีที่ http://www.inkscape.org/)
2. สร้างพื้นปุ่ม เลือกสีตามชอบ ในที่นี้ผมเลือกสีน้ำเงิน
3. Duplicate ปุ่มนี้ เปลี่ยนสีเป็นสีดำ จากนั้นปรับสีแบบไล่สี (gradient) จากมืดไปสว่าง
4. จากนั้นลากไปทับรูปสีน้ำเงิน
5. Duplicate พื้นของปุ่มนี้ เปลี่ยนสีเป็นสีดำ ปรับค่า blur ให้สูงขึ้น

6. ลากมาวางทับปุ่มหลัก กำหนดให้ไปอยู่หลังสุดของภาพ


7. สร้างตัวหนังสือมาวางทับ ได้รูปแบบแรกดังนี้

แลัวมาต่อรูปอื่นกันครับ

วันพุธที่ ๑๑ มิถุนายน พ.ศ. ๒๕๕๑

ฟอกสีฟัน ด้วย Artweaver

เราเคยใช้ Paint.NET ทำเทคนิคนี้ไปแล้ว
http://surapongu.blogspot.com/2008/02/paintnet_11.html

ซึ่งสามารถใช้ artweaver ได้เช่นกัน ดังนี้

รูปต้นฉบับ
ขั้นตอน
  1. เปิดรูป
  2. สร้าง Layer ใหม่ ตั้งชื่อเป็น White teeth ซึ่งเราจะวาดสีขาวลงบน Layer นี้
  3. เลือก Paintbrush tool แล้วเลือกสีขาว ระบายลง Layer ที่สร้างขึ้นใหม่
  4. ใช้ Filter / Blur / Gaussian blur เพื่อปรับแต่งให้สีขาวกลืนเข้ากับภาพ
  5. ปรับลด opacity ของ Layer อยากให้ขาวมาก ขาวน้อย
  6. เสร็จแล้วครับ

วันอังคารที่ ๑๐ มิถุนายน พ.ศ. ๒๕๕๑

Visual C# GUI 3

ทดลองเล่น radioButton กับ checkBox กันครับ

เป้าหมาย


อันนี้ง่ายๆ ครับ ใช้คุณสมบัติ Checked

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
radioDT.Checked = true;
radioPC.Checked = true;
cbMouse.Checked = true;
}

private void bttOK_Click(object sender, EventArgs e)
{
string choice = "คุณเลือก ";
if (radioDT.Checked)
choice += radioDT.Text;
else if (radioNB.Checked)
choice += radioNB.Text;
choice += Environment.NewLine + "ประเภท ";
if (radioPC.Checked)
choice += radioPC.Text;
else if(radioMAC.Checked)
choice += radioMAC.Text;
choice += Environment.NewLine + "และของแถม ";
if (cbMouse.Checked)
choice += cbMouse.Text + " ";
if (cbFlash.Checked)
choice += cbFlash.Text;

txtResult.Text = choice;
}
}

เรียบร้อยครับ

Visual C# GUI 2

วันนี้เราจะทดลองเล่นกับ ComboBox กันนะครับ

เป้าหมาย

เมื่อคลิกปุ่ม ตกลง จะได้


กำหนดให้ comboBox ของอาหารคาว ชื่อ cmbFood และ อาหารหวาน ชื่อ cmbDessert และ ปุ่มตกลงชื่อ bttOK

สำหรับ cmbFood เราจะเพิ่มรายการอาหารจากเมนู Properties โดยเลือกหัวข้อ Items


เมื่อคลิก จะเกิดช่องให้เติมรายการ


ส่วน cmbDessert เราจะเขียนรหัสโปรแกรมเพื่อเพิ่มรายการทีหลัง

จากนั้นดับเบิลคลิกปุ่มตกลง แล้วเพิ่มรหัสดังนี้

ส่วนแรกเป็นส่วนที่ทำงานเมื่อเรียกฟอร์มขึ้นมา
public Form1()
{
InitializeComponent();
string[] dessert = {"รวมมิตร", "บัวลอย", "กล้วยบวดชี"};
cmbDessert.Items.AddRange(dessert); //เพิ่มรายการของหวานให้คอมโบ
cmbFood.SelectedIndex = 0; //เลือกรายการแรก
cmbDessert.SelectedIndex = 0; //เลือกรายการแรก
}

ส่วนของปุ่มตกลง
private void bttOK_Click(object sender, EventArgs e)
{
MessageBox.Show("คุณเลือก "+cmbFood.Text+" และ "+cmbDessert.Text,"รายการอาหาร",MessageBoxButtons.OK,MessageBoxIcon.Information);
}

จะสังเกตว่าเราใช้คุณสมบัติ Text ของคอมโบได้โดยตรง นอกจากนี้แล้ว เรายังสามารถรู้ได้ว่าเลือกรายการอันดับที่เท่าไร โดยดูจากคุณสมบัติ SelectedIndex

วันนี้ก็ขอจบคร่าวๆแค่นี้ครับ

Visual C# GUI 1

เรามาสร้าง user interface เบื้องต้นกับ Visual C# 2005 กันครับ

วันนี้เราจะสร้างโปรแกรมรับข้อความจากผู้ใช้แล้วแสดงผลอย่างง่ายๆ ดังนี้


เมื่อป้อนข้อความแล้วคลิกปุ่มตกลง จะได้


แต่ถ้าไม่ป้อนข้อความใดแล้วคลิกปุ่มตกลง จะแสดงข้อความเตือน


และสามารถลบข้อความที่กำลังป้อน พร้อมปุ่มจบการทำงาน

เริ่มต้นด้วย
เลือก Windows Application

จากนั้นออกแบบโปรแกรมให้มีลักษณะดังนี้


โดยกำหนดชื่อแต่ละคอนโทรลดังนี้
กล่องข้อความ ชื่อ txtInput
ปุ่มตกลง ชื่อ bttOK
ปุ่มลบ ชื่อ bttClear
ปุ่มจบการทำงาน ชื่อ bttExit

จากนั้นดับเบิลคลิกที่ปุ่ม ตกลง แล้วเพิ่มรหัสโปรแกรมดังนี้
private void bttOK_Click(object sender, EventArgs e)
{
string stext = txtInput.Text.Trim();
if (stext.Length != 0)
MessageBox.Show("คุณป้อนข้อความว่า " + stext, "ข้อความของคุณ", MessageBoxButtons.OK, MessageBoxIcon.Information);
else
MessageBox.Show("คุณไม่ได้ป้อนข้อความใดๆ","ผิดพลาด",MessageBoxButtons.OK,MessageBoxIcon.Error);
}

สำหรับปุ่ม ลบ
private void bttClear_Click(object sender, EventArgs e)
{
txtInput.Clear(); // จะใช้ txtInput.Text = "" ก็ได้
txtInput.Focus();
}

สำหรับปุ่ม จบการทำงาน
private void bttExit_Click(object sender, EventArgs e)
{
Application.Exit();
}

จากนั้นทดลองกดเมนู Debug / Start without Debugging เื่พื่อดูผลลัพธ์
เสร็จแล้วครับ

วันอาทิตย์ที่ ๘ มิถุนายน พ.ศ. ๒๕๕๑

SWFTOOLS แปลงไฟล์หลากหลายให้เป็นแฟลช

อยากเอาไฟล์ วิดีโอ, เสียง, เอกสาร pdf ขึ้นเว็บแบบแฟลช ทำไงดี

อยากแยกไฟล์ รูป, วิดีโอ, เสียง ออกจากไฟล์แฟลช ทำไงดี

อยากรวมไฟล์แฟลชเข้าด้วยกัน ทำไงดี

ลองใช้ SWFTOOLS ดูสิครับ
http://www.swftools.org

จิ๋วแต่แจ๋ว ฟรี แต่ต้องพิมพ์คำสั่งเอาเองนะ

แล้วเราจะมาลองเล่นกัน

GLE บทนำ: คู่แข่งที่อาจสวยกว่า gnuplot

มีโปรแกรมสร้างกราฟและวาดรูปดีๆมาฝากอีกแล้วครับ

GLE Graphics Layout Engine
http://www.gle-graphics.org/

เป็นโปรแกรมคล้ายๆกับ gnuplot ที่ใช้สร้างกราฟ เหมือนกันคือต้องพิมพ์คำสั่งเพื่อใช้งาน

ข้อดี
  • ฟรีๆๆๆๆ
  • ขนาดเล็ก พกพาได้
  • สร้างกราฟได้หลากหลาย
  • รองรับฟังก์ชันที่สร้างขึ้นเอง
  • สามารถบันทึกผลลัพธ์ได้หลายรูปแบบ
  • มีตัวช่วยตกแต่ง
ข้อด้อย (มั้ง)
  • ผลลัพธ์ปกติจะเป็นไฟล์ eps ต้องใช้ ghostscript แปลงเป็นไฟล์ชนิดอื่น
อย่างไรก็ตาม เราสามารถจัดการกับข้อด้อยนี้ได้ง่ายๆ
เอาไว้มาต่อกันบทต่อไปนะครับ

Gnuplot ภาคสอง: บันทึกคำสั่ง และ การสร้างกราฟจากไฟล์ข้อมูล

บทความก่อนหน้า
ภาคหนึ่ง แนะนำ gnuplot

จากคราวที่แล้ว เรารู้จักวิธีสร้างกราฟจากสมการง่ายๆแล้ว คราวนี้เราลองมาเรียนรู้คำสั่ง gnuplot เพิ่มเติม

เราทราบแล้วว่าเมื่อจะใช้งาน gnuplot ต้องป้อนคำสั่ง

หากต้องการเรียกคำสั่งเดิมมาใช้งาน สามารถทำได้โดยกดแป้นลูกศรชี้ขี้น

แต่ถ้ามีหลายๆคำสั่งล่ะ

มันก็จะง่ายกว่าถ้าสามารถบันทึกคำสั่งทั้งหมดไว้เป็นไฟล์ แล้วเรียกมาใช้งานได้

ทดลองสร้างไฟล์คำสั่งโดยใช้โปรแกรมพิมพ์ข้อความเช่น notepad แล้วพิมพ์คำสั่ง


จากนั้นเพื่อความง่าย ก็บันทึกไว้ในไดเรกทอรีเดียวกับ gnuplot สมมติบันทึกเป็นชื่อว่า basic.plt

เมื่อต้องการเรียกใช้งานชุดคำสั่งที่บันทึกไว้ ก็เพียงแต่พิมพ์ว่า
load "basic.plt"


และหากต้องการพลอตกราฟจากข้อมูลดิบล่ะ

ก็ต้องมีข้อมูลที่ของค่าพิกัด โดยแต่ละคอลัมน์คือ ค่าของแกน x และ y

สมมติว่า เรามีข้อมูลบันทึกไว้ในชื่อไฟล์ myHeight.dat แสดงส่วนสูงในแต่ละปี ดังนี้

2000 157
2001 160
2002 166
2003 170
2004 175
2005 178

ให้แก้คำสั่งในไฟล์ basic.plt เป็น
plot "myHeight.dat" using 1:2 title 'my height'

ซึ่งหมายความว่า ให้ใช้ข้อมูลในไฟล์ชื่อ myHeight.dat โดยใช้เฉพาะคอลัมน์หนึ่งและสอง แล้วกำหนดชื่อให้ข้อมูลนี้ว่า my height

จากนั้นเรียกใช้คำสั่ง
load "basic.plt"

จะได้ผลลัพธ์เป็น

หากต้องการให้มีเส้นด้วย จะใช้คำสั่ง
plot "myHeight.dat" using 1:2 title 'my height' with linespoints

หรือหากต้องการแค่เส้น
plot "myHeight.dat" using 1:2 title 'my height' with lines

สมมติว่ามีข้อมูลสองชุด แล้วต้องการพลอตในกราฟเดียวกัน เช่น ข้อมูลส่วนสูงของนักเรียนสองคนในแต่ละปี
2000 157 142
2001 160 146
2002 166 150
2003 170 155
2004 175 157
2005 178 157

เราสามารถใช้คำสั่ง
plot "myHeight.dat" using 1:2 title 'Somchai' with linespoints, \
(ขึ้นบรรทัดใหม่ตรงนี้)
"myHeight.dat" using 1:3 title 'Somsri' with linespoints

ก็จะได้ผลลัพธ์ดังรูป

วันนี้ขอพอแค่นี้ก่อนนะครับ
จบตอนสอง

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

Gnuplot ภาคหนึ่ง

ถ้าคุณอยากหาซอฟต์แวร์สำหรับสร้างกราฟ ที่....
  • ฟรี
  • ขนาดเล็กกะทัดรัด
  • ไม่ต้องติดตั้ง พกพาไปกับแฟลชไดร์ฟได้
  • สร้างกราฟได้ทั้งสองและสามมิติ
  • บันทึกกราฟได้หลายรูปแบบ jpg, png, latex เป็นต้น
  • ใช้งานได้ในหลายระบบปฏิบัติการ ทั้งวินโดวส์ ยูนิกซ์ ลีนุกซ์ ฯลฯ
ทางเลือกหนึ่งของผม (และอาจจะคุณด้วย) ก็คือ แต่น แต้น..... gnuplot

ดาวน์โหลดได้ที่นี้ครับ http://www.gnuplot.info/

สำหรับวินโดวส์ ให้ดาวน์โหลดไฟล์ชื่อ gp423win32.zip แล้วคลายออกไปไว้ในไดเรกทอรีใดๆ ตามต้องการ

เมื่อต้องการเรียกใช้ ให้เข้าไปในไดเรกทอรี bin เรียกไฟล์ชื่อ wgnuplot.exe จะเห็นหน้าตาแบบนี้


ส่วนที่เคอร์เซอร์กะพริบก็คือรอเราป้อนคำสั่งสำหรับการสร้างกราฟนั่นเอง

ไม่ต้องตกใจครับ การใช้งาน gnuplot เป็นแบบ command-line หรือป้อนคำสั่ง แต่ก็มีเมนูช่วยด้วยพอสมควร

เรามาเริ่มใช้งานคำสั่งง่ายๆกันดูครับ

ลองพิมพ์
plot sin(x)
แล้วกดแป้น enter

จะได้



ง่ายไหมครับ

คราวนี้ลองปิดหน้าต่างกราฟ

จะเห็นว่าช่วงในการแสดงผลถูกกำหนดโดนอัตโนมัติ

ทดลองกำหนดช่วงตามแกน x โดยที่นี้เราต้องการแสดงผลในช่วง [-3.14, 3.14] ก็สามารถเขียนได้ว่า
plot [-3.14:3.14] sin(x)


หรือถ้าหากต้องการใช้คำสั่งเฉพาะในการกำหนดช่วง x ก็ทำได้โดย
set xrange [-3.14:3.14]
plot sin(x)

ในกรณีที่เราพลอตกราฟไปแล้ว และต้องการแก้ไขบางส่วน เราสามารถใช้คำสั่ง replot ช่วยได้ เช่น
set yrange [0,1]
replot

สุดท้าย เรามาลองกำหนดชื่อกราฟ ชื่อแกนกัน
set title "Plot of sin(x)"
set xlabel "Angle"
set ylabel "Unit"
replot

ขอให้สนุกกับ gnuplot เบื้องต้นนะครับ

ภาคสอง บันทึกคำสั่งและการสร้างกราฟจากไฟล์ข้อมูล

วันจันทร์ที่ ๑๑ กุมภาพันธ์ พ.ศ. ๒๕๕๑

ฟอกสีฟันด้วย Paint.NET

อ้างอิงจาก
http://graphicssoft.about.com/od/paintnet/ht/whitenteeth.htm

แหม รูปถ่ายฟันไม่ขาวอินเทรนด์เลย ทำไงดีล่ะ
ไม่ยากครับ

ตัวอย่างรูป



ผลลัพธ์ (หลังฟอกสีฟัน ฮ่าๆ)



ขั้นตอน
  • เปิดรูป
  • สร้าง Layer จากเมนู Layers / Add New Layer แล้วเปลี่ยนชื่อ เช่น White teeth ซึ่งเราจะวาดสีขาวลงบน Layer นี้ ให้ทับกับตำแหน่งฟันใน Background
  • ปรับค่า Opacity ของ Layer ใหม่ให้ลดลงเหลือประมาณ 125 เพื่อไม่ให้สีขาวที่จะวาดทับฟันสว่างเกินไป
  • ซูมภาพซะหน่อย
  • เลือก Paintbrush tool แล้วเลือกสีขาว
  • ปรับขนาดแปรงให้เล็กๆหน่อย พยายามระบายสีฟันให้ห่างจากเหงือกพอควร ตอนนี้ภาพจะดูเฟคสุดๆ



  • ใช้ Effects / Blurs / Gaussian Blur เข้าช่วยลดการเฟค ปรับแต่ง radius ตามใจชอบ
  • ปรับลด Opacity ของ Layer ตามใจชอบ อยากขาวมากขาวน้อย พยายามให้ดูสมจริง
  • เสร็จแล้วครับ บันทึกผลลัพธ์ได้