ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:31.72KB ,
资源ID:5743440      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5743440.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(C#图像处理.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

C#图像处理.docx

1、C#图像处理一Bitmap类Bitmap对象封装了+中的一个位图,此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义的图像的对象.该类的主要方法和属性如下:1. GetPixel方法和 SetPixel方法:获取和设置一个图像的指定像素的颜色.2. PixelFormat属性:返回图像的像素格式.3. Palette属性:获取和设置图像所使用的颜色调色板.4. Height Width属性:返回图像的高度和宽度.5. LockBits 方法和UnlockBits方法:分别锁定和解锁系统内存中的位图像素.在基于像素点的图像处理方法中使用LockBits 和Unloc

2、kBits是一个很好的方式,这两种方法可以使我们指定像素的范围来控制位图的任意一部分,从而消除了通过循环对位图的像素逐个进行处理,每调用LockBits 之后都应该调用一次UnlockBits. 二BitmapData类BitmapData对象指定了位图的属性1. Height属性:被锁定位图的高度.2. Width属性:被锁定位图的高度.3. PixelFormat属性:数据的实际像素格式.4. Scan0属性:被锁定数组的首字节地址,如果整个图像被锁定,则是图像的第一个字节地址.5. Stride属性:步幅,也称为扫描宽度.如上图所示,数组的长度并不一定等于图像像素数组的长度,还有一部分未

3、用区域,这涉及到位图的数据结构,系统要保证每行的字节数必须为4的倍数. 三Graphics类Graphics对象是+的关键所在,许多对象都是由Graphics类表示的,该类定义了绘制和填充图形对象的方法和属性,一个应用程序只要需要进行绘制或着色,它就必须使用Graphics对象. 四Image类这个类提供了位图和元文件操作的函数.Image类被声明为abstract,也就是说Image类不能实例化对象,而只能做为一个基类.1.FromFile方法:它根据输入的文件名产生一个Image对象,它有两种函数形式:public static Image FromFile(string filename

4、);public static Image FromFile(string filename, bool useEmbeddedColorManagement);2.FromHBitmap方法:它从一个windows句柄处创建一个bitmap对象, 它也包括两种函数形式:public static bitmap fromhbitmap(intptr hbitmap);public static bitmap fromhbitmap(intptr hbitmap, intptr hpalette);3. FromStream方法:从一个数据流中创建一个image对象,它包含三种函数形式 :pub

5、lic static image fromstream(stream stream);public static image fromstream(stream stream, bool useembeddedcolormanagement);fromstream(stream stream, bool useembeddedcolormanagement, bool validateimagedata); 有了上面的了解,我们便可以开始利用#做图像处理,下面介绍几种方法:一. 打开、保存、显示图像 private Bitmap srcBitmap = null; private Bitmap

6、 showBitmap = null;/打开文件private void menuFileOpen_Click(object sender, EventArgs e)OpenFileDialog openFileDialog = new OpenFileDialog();openFileDialog.Filter = Bitmap文件(*.bmp)|*.bmp|Jpeg文件(*.jpg)|*.jpg|所有合适文件(*.bmp,*.jpg)|*.bmp;*.jpg;openFileDialog.FilterIndex = 3;openFileDialog.RestoreDirectory = t

7、rue;if (DialogResult.OK = openFileDialog.ShowDialog()srcBitmap = (Bitmap)Bitmap.FromFile(openFileDialog.FileName, false);showBitmap = srcBitmap;this.AutoScroll = true;this.AutoScrollMinSize = new Size(int)(showBitmap.Width), (int)(showBitmap.Height);this.Invalidate(); /保存图像文件private void menuFileSav

8、e_Click(object sender, EventArgs e)if (showBitmap != null)SaveFileDialog saveFileDialog = new SaveFileDialog();saveFileDialog.Filter = Bitmap文件(*.bmp)|*.bmp|Jpeg文件(*.jpg)|*.jpg|所有合适文件(*.bmp,*.jpg)|*.bmp;*.jpg;saveFileDialog.FilterIndex = 3;saveFileDialog.RestoreDirectory = true;if (DialogResult.OK =

9、 saveFileDialog.ShowDialog() ImageFormat format = ImageFormat.Jpeg;switch (Path.GetExtension(saveFileDialog.FileName).ToLower()case .jpg:format = ImageFormat.Jpeg;break;case .bmp:format = ImageFormat.Bmp;break;default:MessageBox.Show(this, Unsupported image format was specified, Error,MessageBoxButt

10、ons.OK, MessageBoxIcon.Error);return;tryshowBitmap.Save(saveFileDialog.FileName,format );catch (Exception)MessageBox.Show(this, Failed writing image file, Error,MessageBoxButtons.OK, MessageBoxIcon.Error);/窗口重绘,在窗体上显示图像,重载Paintprivate void frmMain_Paint(object sender, System.Windows.Forms.PaintEvent

11、Args e)if (showBitmap != null) Graphics g = e.Graphics;g.DrawImage(showBitmap, new Rectangle(this.AutoScrollPosition.X, this.AutoScrollPosition.Y ,(int)(showBitmap.Width), (int)(showBitmap.Height); /灰度化private void menu2Gray_Click(object sender, EventArgs e)if (showBitmap = null) return;showBitmap =

12、 RGB2Gray(showBitmap);/下面都以RGB2Gray为例this.Invalidate();二. 提取像素法这种方法简单易懂,但相当耗时,完全不可取.public static Bitmap RGB2Gray(Bitmap srcBitmap)Color srcColor;int wide = srcBitmap.Width;int height = srcBitmap.Height;for (int y = 0; y height; y+)for (int x = 0; x wide; x+)/获取像素的颜色值srcColor = srcBitmap.GetPixel(x,

13、 y);byte temp = (byte)(srcColor.R * .299 + srcColor.G * .587 + srcColor.B * .114);/设置像素的颜色值 srcBitmap.SetPixel(x, y, Color.FromArgb(temp, temp, temp);return srcBitmap ;/# 三. 内存法这是比较常用的方法public static Bitmap RGB2Gray(Bitmap srcBitmap)int wide = srcBitmap.Width; int height = srcBitmap.Height;Rectangle

14、 rect = new Rectangle(0, 0, wide, height);/ 将Bitmap锁定到系统内存中, 获得BitmapDataBitmapData srcBmData = srcBitmap.LockBits(rect,ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);/创建BitmapBitmap dstBitmap = CreateGrayscaleImage(wide, height);/这个函数在后面有定义BitmapData dstBmData = dstBitmap.LockBits(rect,ImageL

15、ockMode.ReadWrite, PixelFormat.Format8bppIndexed);/ 位图中第一个像素数据的地址。它也可以看成是位图中的第一个扫描行System.IntPtr srcPtr = srcBmData.Scan0;System.IntPtr dstPtr = dstBmData.Scan0;/ 将Bitmap对象的信息存放到byte数组中int src_bytes = srcBmData.Stride * height;byte srcValues = new bytesrc_bytes;int dst_bytes = dstBmData.Stride * hei

16、ght;byte dstValues = new bytedst_bytes;/复制GRB信息到byte数组System.Runtime.InteropServices.Marshal.Copy(srcPtr, srcValues, 0, src_bytes);System.Runtime.InteropServices.Marshal.Copy(dstPtr, dstValues, 0, dst_bytes);/ 根据Y=0.299*R+0.114*G+0.587B,Y为亮度for (int i = 0; i height; i+)for (int j = 0; j wide; j+) /只

17、处理每行中图像像素数据,舍弃未用空间/注意位图结构中RGB按BGR的顺序存储int k = 3 * j;byte temp = (byte)(srcValuesi * srcBmData.Stride + k + 2 * .299+ srcValuesi * srcBmData.Stride + k + 1 * .587 + srcValuesi * srcBmData.Stride + k * .114);dstValuesi * dstBmData.Stride + j = temp;/将更改过的byte拷贝到原位图System.Runtime.InteropServices.Marsha

18、l.Copy(dstValues, 0, dstPtr, dst_bytes);/ 解锁位图srcBitmap.UnlockBits(srcBmData);dstBitmap.UnlockBits(dstBmData);return dstBitmap;/#四 指针法C/C+的习惯,不是C#的特点public static Bitmap RGB2Gray(Bitmap srcBitmap)int wide = srcBitmap.Width;int height = srcBitmap.Height ;Rectangle rect = new Rectangle(0, 0, wide, hei

19、ght);BitmapData srcBmData = srcBitmap.LockBits(rect,ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);Bitmap dstBitmap = CreateGrayscaleImage(wide, height);BitmapData dstBmData = dstBitmap.LockBits(rect,ImageLockMode.ReadWrite, PixelFormat.Format8bppIndexed); System.IntPtr srcScan = srcBmData.Sca

20、n0;System.IntPtr dstScan = dstBmData.Scan0;Unsafe /启动不安全代码byte* srcP = (byte*)(void*) srcScan;byte* dstP = (byte*)(void*) dstScan;int srcOffset = srcBmData.Stride - wide * 3;int dstOffset = dstBmData.Stride - wide ;byte red, green, blue;for (int y = 0; y height; y+)for (int x = 0; x wide ; x+, srcP

21、+= 3, dstP+)blue = srcP 0;green = srcP 1;red = srcP 2;* dstP = (byte)(.299 * red + .587 * green + .114 * blue);srcP += srcOffset;dstP += dstOffset;srcBitmap.UnlockBits(srcBmData);dstBitmap.UnlockBits(dstBmData );return dstBitmap;/#五. 矩阵法并不是什么新方法,只是将图像数据分做R,G,B三个矩阵(二维数组)存储,类似MATLAB的习惯.public static b

22、ool GetRGB(Bitmap Source, out int, R, out int, G, out int, B)tryint iWidth = Source.Width;int iHeight = Source.Height;Rectangle rect = new Rectangle(0, 0, iWidth, iHeight);System.Drawing.Imaging.BitmapData bmpData = Source.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, Source.PixelFo

23、rmat);IntPtr iPtr = bmpData.Scan0;int iBytes = iWidth * iHeight * 3;byte PixelValues = new byteiBytes;System.Runtime.InteropServices.Marshal.Copy(iPtr, PixelValues, 0, iBytes);Source.UnlockBits(bmpData);/ 注意这个地方图像的两维方向与数组两维的方向是转置的关系 R = new intiHeight, iWidth;G = new intiHeight, iWidth;B = new intiH

24、eight, iWidth;int iPoint = 0;for (int i = 0; i iHeight; i+)for (int j = 0; j iWidth; j+)/ 注意,Windows 中三基色的排列顺序是 BGR 而不是 RGB! Bi, j = Convert.ToInt32(PixelValuesiPoint+);Gi, j = Convert.ToInt32(PixelValuesiPoint+);Ri, j = Convert.ToInt32(PixelValuesiPoint+);return true;catch (Exception)R = null;G = n

25、ull;B = null;return false;/#public static Bitmap FromRGB(int, R, int, G, int, B)int iWidth = G.GetLength(1);int iHeight = G.GetLength(0);Bitmap Result = new Bitmap(iWidth, iHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb);Rectangle rect = new Rectangle(0, 0, iWidth, iHeight);System.Drawing

26、.Imaging.BitmapData bmpData = Result.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format24bppRgb);IntPtr iPtr = bmpData.Scan0;int iStride = bmpData.Stride; int iBytes = iWidth * iHeight * 3;byte PixelValues = new byteiBytes;int iPoint = 0;for (int

27、 i = 0; i iHeight; i+)for (int j = 0; j iWidth; j+)int iG = Gi, j;int iB = Bi, j;int iR = Ri, j;PixelValuesiPoint = Convert.ToByte(iB);PixelValuesiPoint + 1 = Convert.ToByte(iG);PixelValuesiPoint + 2 = Convert.ToByte(iR);iPoint += 3;System.Runtime.InteropServices.Marshal.Copy(PixelValues, 0, iPtr, i

28、Bytes);Result.UnlockBits(bmpData);return Result;/#public static bool GetGray(Bitmap srcBitmap, out byte , gray)Bitmap tempBitmap;if (srcBitmap.PixelFormat != PixelFormat.Format8bppIndexed)tempBitmap = ImageProcess.Image.Gray(srcBitmap);elsetempBitmap = srcBitmap;int wide = tempBitmap.Width;int heigh

29、t = tempBitmap.Height;gray = new byte height, wide;BitmapData gbmData = tempBitmap.LockBits(new Rectangle(0, 0, wide, height),ImageLockMode.ReadWrite, PixelFormat.Format8bppIndexed);System.IntPtr ScanG = gbmData.Scan0;int gOffset = gbmData.Stride - wide;unsafebyte* g = (byte*)(void*)ScanG;/ for each

30、 pixelfor (int y = 0; y height; y+)/ for each pixelfor (int x = 0; x wide; x+, g+)grayy ,x =*g;g += gOffset;tempBitmap.UnlockBits(gbmData);return true ;/#public static Bitmap FromGray(byte , Gray)int iWidth = Gray.GetLength(1);int iHeight = Gray.GetLength(0);Bitmap dstBitmap = ImageProcess.Image.CreateGrayscaleImage(iWidth, iHeight);BitmapData gbmData = dstBitmap.LockBits(new Rectangle(0, 0, iWidth, iH

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1