搜尋此網誌

顯示具有 C# 標籤的文章。 顯示所有文章
顯示具有 C# 標籤的文章。 顯示所有文章

2009年5月1日 星期五

C# Image to CSV





















這是一張10x10 pixel的點陣圖,我將它利用Photoshop放大成3200%















這個CSV檔是由上圖所讀取出來的,0代表黑色,255代表白色

以觀念來說這個CSV檔裡的數值是表示最上面那張10x10的圖沒錯

為了好看我用較好理解的寫法實現它,C#寫法如下:

//開啟圖至pictureBox1
private void btnOpen_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "BMP(*.BMP)|*.bmp|" + "所有檔案|*.*";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
pictureBox1.Width = Image.FromFile(openFileDialog.FileName).Width;
pictureBox1.Height = Image.FromFile(openFileDialog.FileName).Height;
pictureBox1.Image = Image.FromFile(openFileDialog.FileName);
}
}


因為是黑白影像,這邊我只對R讀取。


private void btnProcess_Click(object sender, EventArgs e)
{
FileStream fw = new FileStream( @"c:\r.csv", FileMode.Open);
StreamWriter sw = new StreamWriter(fw, System.Text.Encoding.Default);
string str;
Bitmap p1 = (Bitmap)pictureBox1.Image;
int[,] r = new int[p1.Height, p1.Width];
int[,] g = new int[p1.Height, p1.Width];
int[,] b = new int[p1.Height, p1.Width];

for (int i = 0; i < p1.Height; i++)
{
for (int j = 0; j < p1.Width; j++)
{
r[i, j] = p1.GetPixel(j, i).R;
if (j < p1.Width )
{
//最後一個值後面不用逗號
if (j == p1.Width -1)
{
str = r[i, j] + "";
sw.Write(str);
}
else
{
str = r[i, j] + ",";
sw.Write(str);
}
}
}
//換行繼續下一個j迴圈寫入
sw.Write('\n');
}
sw.Flush();
fw.Close();
MessageBox.Show("執行完畢");
}





範例檔下載

2009年4月24日 星期五

C# picturebox1上圖片轉為矩陣

假設form上有picturebox1及picturebox2
我想做的事就是將picturebox1上圖片轉存為矩陣
對這矩陣做一些演算法之類的手腳,再將這矩陣轉換為影像顯示在picturebox2上...
雖然人的腦容量很大,但常常會忘了怎麼寫...

我這裡只是將lena存到矩陣再將矩陣轉存為影像顯示在picturebox2上















上圖Process按鈕的寫法為:

private void btnProcess_Click(object sender, EventArgs e)
{
Bitmap p1 = (Bitmap)pictureBox1.Image;
int[,] r = new int[p1.Height, p1.Width];
int[,] g = new int[p1.Height, p1.Width];
int[,] b = new int[p1.Height, p1.Width];

for (int i = 0; i < p1.Height; i++)
{
for (int j = 0; j < p1.Width; j++)
{
r[i, j] = p1.GetPixel(j, i).R;
g[i, j] = p1.GetPixel(j, i).G;
b[i, j] = p1.GetPixel(j, i).B;
}
}

Bitmap p2 = new Bitmap(p1.Height,p1.Width);
for (int i = 0; i < p1.Height; i++)
{
for (int j = 0; j < p1.Width; j++)
{
p2.SetPixel(j,i,Color.FromArgb(r[i,j],g[i,j],b[i,j]));
}
}
pictureBox2.Image = p2;
}

C# picturebox1與picturebox2 影像處理問題

如果說實際上原圖與修改過後的圖要放在同一個form裡做比較,如果拿我之前寫的GetPixel與SetPixel方式下去改,以當下直覺寫法可能會為

private void btnGray_Click(object sender, EventArgs e)
{
try
{
Bitmap bm1 = (Bitmap)pictureBox1.Image;
Bitmap bm2 = bm1;
int w1 = pictureBox1.Image.Width;
int h1 = pictureBox1.Image.Width;
int x;
int y;
for (y = 0; y <= h1 - 1; y++)
{
for (x = 0; x <= w1 - 1; x++)
{
Color c1 = bm1.GetPixel(x, y);
int r1 = c1.R;
int g1 = c1.G;
int b1 = c1.B;
int avg1 = (r1 + g1 + b1) / 3;
bm2.SetPixel(x, y, Color.FromArgb(avg1, avg1, avg1));
}
}
pictureBox2.Image = bm2;
}

catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}


而立即顯示出來的圖可能是沒有問題或是怪怪的...















而當我按下Refresh按鍵時會發現...
















實質上bm2=bm1以為是另外複製一個圖片到picturebox2上,但當我們在做影像處理時在記憶體中是用相同的區塊...

所以可以寫成這樣...

private void btnProcess_Click(object sender, EventArgs e)
{
Bitmap p1 = (Bitmap)pictureBox1.Image;
Bitmap p2 = new Bitmap(p1.Height, p1.Width);
int avg;
for (int i = 0; i < p1.Height; i++)
{
for (int j = 0; j < p1.Width; j++)
{
avg = (p1.GetPixel(i,j).R + p1.GetPixel(i,j).G + p1.GetPixel(i,j).B)/3;
p2.SetPixel(i, j, Color.FromArgb(avg, avg, avg));
}
}
pictureBox2.Image = p2;
}

當我按完Process再按Refresh時,picturebox1還是保持彩色圖片...

2009年4月5日 星期日

C# 連接 MySQL

下載MySQL Connector Net 5.2.5並安裝
加入參考MySql.Data

using MySql.Data.MySqlClient;
//...
//略
//...

//連接按鈕
private void connectBtn_Click(object sender, System.EventArgs e)
{
if (conn != null)
conn.Close();
//連接字串
string connStr = String.Format("server=localhost;user id=root; password=123456; database=addressbook; pooling=false");

try
{
conn = new MySqlConnection( connStr );
conn.Open();
//取得資料表
GetTable();
}
catch (MySqlException ex)
{
MessageBox.Show( "連接失敗:" + ex.Message );
}
}

//取得資料表
private void GetTable()
{
try
{
data = new DataTable();
//顯示好友名單資料表
da = new MySqlDataAdapter("SELECT * FROM friend" , conn);
cb = new MySqlCommandBuilder(da);
da.Fill(data);
//放到DataGrid顯示
dataGrid.DataSource = data;
}
catch (MySqlException ex)
{
MessageBox.Show("資料表顯示異常:" + ex.Message);
}

}

//更新按鈕
private void updateBtn_Click(object sender, System.EventArgs e)
{
DataTable changes = data.GetChanges();
da.Update( changes );
data.AcceptChanges();
}

將addressbook資料庫裡的friend資料表顯示到DataGrid
在DataGrid裡修改完資料可按更新按鈕來更新資料庫裡的資料
參考於MySQL Connector Net 5.2.5裡的Samples

如果有安裝MySQL Connector Net 5.2.5可以到以下路徑找
C:\Program Files\MySQL\MySQL Connector Net 5.2.5\Samples\Table Editor\cs

2009年2月27日 星期五

C# 利用指標灰階化影像

這個方法比起GetPixel、SetPixel方法速度較為優秀許多,但是撰寫起來也是相較之下較困難,當然這是對於我這個C功力較不深厚的我而言,在這裡做個筆記,以防每次突然要用到還得翻箱倒櫃。
參考了「井民全」先生的這篇「撰寫影像處理程式 難不倒我 !! - 簡單的數位影像處理 ( C# 篇)」從而得知「Christian Graus」的這篇「http://www.codeproject.com/KB/GDI-plus/csharpgraphicfilters11.aspx」,而裡面就有一小段GrayScale灰階化的程式碼,這段程式碼實際上run起來跟我另外用VB6的GetPixel、SetPixel撰寫比較起來執行效率真的有很明顯的差異。

開啟圖片





















灰階化
利用Christian Graus的方式

public static bool GrayScale(Bitmap b)
{
BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
int stride = bmData.Stride;
System.IntPtr Scan0 = bmData.Scan0;
unsafe
{
byte * p = (byte *)(void *)Scan0;
int nOffset = stride - b.Width*3;
byte red, green, blue;
for(int y=0; y< b.Height ; ++y)
{
for(int x=0; x < b.Width; ++x )
{
blue = p[0];
green = p[1];
red = p[2];
p[0] = p[1] = p[2] = (byte)(.299 * red + .587 * green + .114 * blue);
p += 3;
}
p += nOffset;
}
}
b.UnlockBits(bmData);
return true;
}






















Sample SourceCode:
Download

2008年11月30日 星期日

C# 簡單一鍵影像灰階化

利用GetPixel與SetPixel達到簡易的圖片灰階化處理。

開啟圖檔

private void btnOpen_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "JPG(*.jpg)|*.jpg|" + "BMP(*.BMP)|*.bmp|" + "GIF(*.GIT)|*.gif|" + "所有檔案|*.*";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
pictureBox1.Width = Image.FromFile(openFileDialog.FileName).Width;
pictureBox1.Height = Image.FromFile(openFileDialog.FileName).Height;
pictureBox1.Image = Image.FromFile(openFileDialog.FileName);
}
}























灰階化

private void btnGray_Click(object sender, EventArgs e)
{
//前提利用OpenFileDialog將影像放到pictureBox1
try
{
//並宣告bm1為Bitmap
Bitmap bm1 = (Bitmap)pictureBox1.Image;
//宣告寬及高
int w1 = pictureBox1.Image.Width;
int h1 = pictureBox1.Image.Width;
int x;
int y;
//掃影像每一個pixel並做處理
for (y = 0; y <= h1 - 1; y++)
{
for (x = 0; x <= w1 - 1; x++)
{
Color c1 = bm1.GetPixel(x, y);
int r1 = c1.R;
int g1 = c1.G;
int b1 = c1.B;
int avg1 = (r1 + g1 + b1) / 3;
bm1.SetPixel(x, y, Color.FromArgb(avg1, avg1,avg1));
}
}
//處理完後放回pictureBox1
pictureBox1.Image = bm1;
}

catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}























Sample SourceCode:
Download



Reference:

日向俊二、陳亦苓 譯,”Visual Basic 2005 功能索引式參考手冊”

2008年11月24日 星期一

C# 利用SaveFileDialog儲存pictureBox1圖片於自設路徑


private void button1_Click(object sender, EventArgs e)
{
try
{
SaveFileDialog saveFileDialog1 = new SaveFileDialog();
saveFileDialog1.Filter = "Bitmap Image|*.bmp";
saveFileDialog1.Title = "儲存圖片";
saveFileDialog1.ShowDialog();
if (saveFileDialog1.FileName != "")
{
System.IO.FileStream fs = (System.IO.FileStream)saveFileDialog1.OpenFile();

switch (saveFileDialog1.FilterIndex)
{
case 1:
this.pictureBox1.Image.Save(fs,
System.Drawing.Imaging.ImageFormat.Bmp);
break;
}

fs.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

C# 直接儲存圖片於當前資料夾

儲存在執行檔同一資料夾裡

pictureBox1.Image.Save(Application.ExecutablePath + "sample.bmp");

C# 顯示AboutBox

加入->新增項目->關於對話方塊(AboutBox1.cs)


private void button1_Click(object sender, EventArgs e)
{
AboutBox1 about1 = new AboutBox1();
about1.Show();
}

C# 利用OpenFileDialog顯示圖片於pictureBox1

利用OpenFileDialog顯示圖片於pictureBox1
pictureBox1的寬及高決定於圖片來源大小

private void btnOpen_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "BMP(*.BMP)|*.bmp|" + "所有檔案|*.*";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
pictureBox1.Width = Image.FromFile(openFileDialog.FileName).Width;
pictureBox1.Height = Image.FromFile(openFileDialog.FileName).Height;
pictureBox1.Image = Image.FromFile(openFileDialog.FileName);
}
}