📄 用c#实现的图象处理(源代码)------正在更新中! - lijigang1982的专栏 - csdnblog.htm
字号:
<BR> System.IntPtr Scan0 = bmData.Scan0;
<BR> unsafe <BR> {
<BR> int nVal;<BR> byte * p =
(byte *)(void *)Scan0;<BR> int nOffset = stride -
b.Width*3; <BR> int nWidth = b.Width *
3;<BR> for(int
y=0;y<b.Height;++y)<BR> {<BR> for
(int x = 0; x < nWidth;
++x)<BR> {<BR> nVal
= (int) (255-p[0]);<BR> p[0] =
(byte)nVal;<BR> ++p;<BR> }<BR> p
+=
nOffset;<BR> }<BR> }<BR> b.UnlockBits(bmData);<BR> pictureBox1.Image=b;<BR> g.Dispose();<BR>//图象处理过程需要不少时间!应该修改下的!<BR>/*以下算法是我参考李兰友老师的《Visual
C#图象处理设计实例》,里面它写到彩色图象<BR>
的逆反处理算法是:<BR> rr=255-c.R;gg=255-c.G;bb=255-c.B;<BR> */<BR>// this.label2.Text="图象反色效果图";<BR>// Color
c = new Color();<BR>// Bitmap box1= new
Bitmap(pictureBox1.Image);<BR>// for (int
i=0;i<this.pictureBox1.Image.Width;i++)<BR>// {<BR>// for
(int
j=0;j<this.pictureBox1.Image.Height;j++)<BR>// {<BR>// c=box1.GetPixel(i,j);<BR>// Color
c1 =
Color.FromArgb(255-c.R,255-c.G,255-c.B);<BR>// box1.SetPixel(i,j,c1);<BR>// }<BR>// pictureBox1.Refresh();<BR>// pictureBox1.Image=box1;<BR>// }<BR>// <BR>// g.Dispose();<BR> }</P>
<P> private void menuItem19_Click(object sender, System.EventArgs
e)<BR> {<BR> Form2 newfrm2 = new
Form2();<BR> newfrm2.ShowDialog();//使用这条语句,别的窗体就不能操作了!<BR>// newfrm2.Show();
//使用这条语句,还可以操作别的窗体!<BR> }</P>
<P> private void menuItem18_Click(object sender, System.EventArgs
e)<BR> {<BR> <BR> //
this.Close();<BR> Application.Exit();//用这条语句也可以的!<BR> }</P>
<P> private void menuItem16_Click(object sender, System.EventArgs
e)<BR> { openFileDialog1=new
OpenFileDialog();<BR> openFileDialog1.Filter =
"Bitmap文件(*.bmp)|*.bmp| Jpeg文件(*.jpg)|*.jpg|所有合适文件(*.bmp / *.jpg)|*.bmp /
*.jpg";<BR> openFileDialog1.FilterIndex = 2
;<BR> openFileDialog1.RestoreDirectory = true
;<BR> if(DialogResult.OK ==
openFileDialog1.ShowDialog())<BR> {<BR> pictureBox1.Image=Bitmap.FromFile(openFileDialog1.FileName,false);<BR> menuItem2.Visible=true;<BR> menuItem3.Visible=true;<BR> menuItem4.Visible=true;<BR> }<BR> //if
(pictureBox2.Image!=null)
pictureBox2.Image=null;<BR> this.label1.Visible=true;<BR> m_copybitmap=new
Bitmap(this.pictureBox1.Image);<BR> menuItem17.Visible=true;<BR> menuItem25.Visible=true;<BR> }<BR>
//有个问题,就是pictureBox1没有保持同图象的大小而变化,这样,使得图形有变形的<BR>
//可能<BR> private void menuItem17_Click(object sender,
System.EventArgs e)<BR> {
<BR> m_bitmap=new
Bitmap(pictureBox1.Image);//这很关键,若删除将无法看到处理后的效果!<BR> saveFileDialog1
= new SaveFileDialog();<BR> saveFileDialog1.Filter =
"Bitmap文件(*.bmp)|*.bmp|Jpeg文件(*.jpg)|*.jpg|所有合适文件(*.bmp / *.jpg)|*.bmp /
*.jpg";<BR> saveFileDialog1.FilterIndex = 2
;<BR> saveFileDialog1.RestoreDirectory = true
;<BR> if(DialogResult.OK ==
saveFileDialog1.ShowDialog())<BR> {
<BR> m_bitmap.Save(saveFileDialog1.FileName);<BR> }<BR> }</P>
<P> private void Form1_Load(object sender, System.EventArgs
e)<BR> {<BR> <BR> }</P>
<P> private void menuItem20_Click(object sender, System.EventArgs
e)<BR> { <BR>/*以下算法是我参考李兰友老师的《Visual
C#图象处理设计实例》,里面它写到彩色图象的浮雕算法是:<BR> g(i,j)=f(i,j)-f(i-1,j)+常数(常数通常取128)<BR> eg:rr=Math.Abs(r2-r1+128)<BR> 我按照它的方法运行了下,效果和用上面程序实现的效果差异很大!<BR> */<BR>//this.label2.Text="图象浮雕效果图";<BR> Graphics
g = this.CreateGraphics ( )
;<BR> g.Clear(this.BackColor);<BR>
Bitmap box1= new Bitmap(pictureBox1.Image);<BR> for (int
i=0;i<pictureBox1.Image.Width-1;i++)<BR> {<BR> for(int
j=0;j<pictureBox1.Image.Height-1;j++)<BR> {<BR> Color
Color1=box1.GetPixel(i,j);<BR> Color
Color2=box1.GetPixel(i+1,j+1);<BR> int
red=Math.Abs(Color1.R-Color2.R+128);<BR> int
green=Math.Abs(Color1.G-Color2.G+128);<BR> int
blue=Math.Abs(Color1.B-Color2.B+128);<BR> //颜色处理<BR> if(red>255) red=255;<BR> if(red<0) red=0;</P>
<P> if(green>255) green=255;<BR> if(green<0) green=0;</P>
<P> if(blue>255) blue=255;<BR> if(blue<0) blue=0;<BR> box1.SetPixel(i,j,Color.FromArgb(red,green,blue));<BR> }<BR> pictureBox1.Refresh();<BR> pictureBox1.Image=box1;<BR> }<BR> g.Dispose();<BR> }</P>
<P> private void menuItem23_Click(object sender, System.EventArgs
e)<BR> { <BR> Graphics g =
this.CreateGraphics ( )
;<BR> g.Clear(this.BackColor);<BR> Form3
newform3=new
Form3();<BR>
newform3.Text="设置图象的亮度!";<BR> newform3.ShowDialog(this);<BR>
brightness=(int)newform3.trackBar1.Value;<BR> newform3.Dispose();<BR>
Bitmap b= new Bitmap(pictureBox1.Image);<BR> // GDI+ return
format is BGR, NOT RGB. <BR> BitmapData bmData = b.LockBits(new
Rectangle(0, 0, b.Width, b.Height),
<BR> ImageLockMode.ReadWrite,
PixelFormat.Format24bppRgb); <BR> int stride = bmData.Stride;
<BR> System.IntPtr Scan0 = bmData.Scan0;
<BR> unsafe <BR> {
<BR> int nVal;<BR> byte * p =
(byte *)(void *)Scan0;<BR> int nOffset = stride -
b.Width*3; <BR> int nWidth = b.Width *
3;<BR> for(int
y=0;y<b.Height;++y)<BR> {<BR> for
(int x = 0; x < nWidth;
++x)<BR> {<BR> nVal
= (int) (p[0] + brightness);<BR> if (nVal
< 0) nVal = 0;<BR> if (nVal > 255) nVal
= 255;<BR> p[0] =
(byte)nVal;<BR> ++p;<BR> }<BR> p
+=
nOffset;<BR> }<BR> }<BR> b.UnlockBits(bmData);<BR> pictureBox1.Image=b;<BR> g.Dispose();<BR> }</P>
<P> private void menuItem21_Click(object sender, System.EventArgs
e)<BR> {<BR> Graphics g = this.CreateGraphics ( )
;//用CreateGraphices()方法创建Graphics对象,这样最好有释放操作!<BR> g.Clear(this.BackColor);//清除背景上可能存在的图案<BR> //
GDI+ return format is BGR, NOT RGB. <BR> Bitmap b= new
Bitmap(pictureBox1.Image);<BR> BitmapData bmData =
b.LockBits(new Rectangle(0, 0, b.Width, b.Height),
<BR> ImageLockMode.ReadWrite,
PixelFormat.Format24bppRgb);//将指定区域的图象锁定到内存
<BR> int stride = bmData.Stride; // bytes in
a row 3*b.Width,获取或设置扫描宽度<BR> System.IntPtr
Scan0 =
bmData.Scan0;//获取或者设置位图中第一个像素数据的地址,它可以看成是位图中第一个扫描行<BR> unsafe
<BR> {
<BR> byte * p = (byte *)(void
*)Scan0;<BR> byte red, green,
blue;<BR> int nOffset = stride -
b.Width*3;<BR> for(int y=0;y <
b.Height;++y)<BR> {<BR> for(int
x=0; x < b.Width; ++x
)<BR> {<BR> blue
= p[0];<BR> green =
p[1];<BR> red =
p[2];<BR> p[0] = p[1] =
p[2] = (byte)(.299 * red
<BR> + .587 * green +
.114 * blue);<BR> p +=
3;<BR> }<BR> p
+=
nOffset;<BR> }<BR> }<BR> b.UnlockBits(bmData);<BR> pictureBox1.Image=b;<BR> g.Dispose();<BR>/*以下算法是我参考李兰友老师的《Visual
C#图象处理设计实例》,里面它写到彩色图象的灰度算法是:<BR> rr=(c.R/64)*64;gg=(c.G/64)*64;bb=(c.B/64)*64;<BR> 我按照它的方法运行了下,效果和用上面程序实现的效果差异很大!<BR> */
<BR>// this.label2.Text="灰度效果图";<BR>// Bitmap
box1= new Bitmap(pictureBox1.Image);<BR>// for (int
i=0;i<pictureBox1.Image.Width-1;i++)<BR>// {<BR>// for(int
j=0;j<pictureBox1.Image.Height-1;j++)<BR>// {<BR>// Color
Color1=box1.GetPixel(i,j);<BR>// int
red=Math.Abs((Color1.R/128)*128);<BR>// int
green=Math.Abs((Color1.G/128)*128);<BR>// int
blue=Math.Abs((Color1.B/128)*128);<BR>// //颜色处理<BR>// if(red>255) red=255;<BR>// if(red<0) red=0;<BR>//<BR>// if(green>255) green=255;<BR>// if(green<0) green=0;<BR>//<BR>// if(blue>255) blue=255;<BR>// if(blue<0) blue=0;<BR>// box1.SetPixel(i,j,Color.FromArgb(red,green,blue));<BR>// }<BR>// pictureBox2.Refresh();<BR>// pictureBox2.Image=box1;<BR>// }<BR> }<BR> private
void menuItem22_Click(object sender, System.EventArgs
e)<BR> {<BR> Graphics g = this.CreateGraphics ( )
;<BR> g.Clear(this.BackColor);<BR> Form3
newform3=new
Form3();<BR> newform3.Text="设置图象的噪声值!";<BR> newform3.ShowDialog(this);<BR> brightness=(int)newform3.trackBar1.Value;<BR> newform3.Dispose();<BR> Bitmap
b= new Bitmap(pictureBox1.Image);<BR> // GDI+ return format is
BGR, NOT RGB. <BR> BitmapData bmData = b.LockBits(new
Rectangle(0, 0, b.Width, b.Height),
<BR> ImageLockMode.ReadWrite,
PixelFormat.Format24bppRgb); <BR> int stride = bmData.Stride;
<BR> System.IntPtr Scan0 = bmData.Scan0;
<BR> unsafe <BR> {
<BR> int nVal;<BR> byte * p =
(byte *)(void *)Scan0;<BR> int nOffset = stride -
b.Width*3; <BR> int nWidth = b.Width *
3;<BR> for(int
y=0;y<b.Height;++y)<BR> {<BR> for
(int x = 0; x < nWidth;
++x)<BR> {<BR> nVal
= (int) (p[0] - brightness);<BR> if (nVal
< 0) nVal = 0;<BR> if (nVal > 255) nVal
= 255;<BR> p[0] =
(byte)nVal;<BR> ++p;<BR> }<BR> p
+=
nOffset;<BR> }<BR> }<BR> b.UnlockBits(bmData);<BR> pictureBox1.Image=b;<BR> g.Dispose();<BR> }</P>
<P> private void menuItem7_Click(object sender, System.EventArgs
e)<BR> {<BR> Graphics g = this.CreateGraphics ( )
;<BR> g.Clear(this.BackColor);<BR> Color c1
=new Color();<BR> Color c2 =new
Color();<BR> Color c3 =new Color();<BR> Color
c4 =new Color();<BR> Color c5=new
Color();<BR> Color c6 =new Color();<BR> Color
c7 =new Color();<BR> Color c8 = new
Color();<BR> Color c9=new Color();<BR> Bitmap
box1= new Bitmap(pictureBox1.Image);<BR> for (int
i=1;i<this.pictureBox1.Image.Width-1;i++)<BR> {<BR> for
(int
j=1;j<this.pictureBox1.Image.Height-1;j++)<BR> {<BR> c1=box1.GetPixel(i-1,j-1);<BR> c2=box1.GetPixel(i,j-1);<BR> c3=box1.GetPixel(i+1,j-1);<BR> c4=box1.GetPixel(i-1,j);<BR> c5=box1.GetPixel(i,j);<BR> c6=box1.GetPixel(i+1,j);<BR> c7=box1.GetPixel(i-1,j+1);<BR> c8=box1.GetPixel(i,j+1);<BR> c9=box1.GetPixel(i+1,j+1);<BR> <BR> int
rr=Math.Abs((c1.R+c2.R+c3.R+c4.R+c5.R+c6.R+c7.R+c8.R+c9.R)/9);<BR> if(rr<0)
rr=0;<BR> if(rr>255)
rr=255;<BR> int
gg=Math.Abs((c1.G+c2.G+c3.G+c4.G+c5.G+c6.G+c7.G+c8.G+c9.G)/9);<BR> if(gg<0)
gg=0;<BR> if(gg>255)
gg=255;<BR> int
bb=Math.Abs((c1.B+c2.B+c3.B+c4.B+c5.B+c6.B+c7.B+c8.B+c9.B)/9);<BR> if(bb<0)
bb=0;<BR> if(bb>255)
bb=255;<BR> Color c =
Color.FromArgb(rr,gg,bb);<BR> box1.SetPixel(i,j,c);<BR> }<BR> pictureBox1.Refresh();<BR> pictureBox1.Image=box1;<BR> }<BR> g.Dispose();<BR> <BR> }</P>
<P> private void menuItem8_Click(object sender, System.EventArgs
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -