首页 > 代码库 > C#GDI+图像处理
C#GDI+图像处理
支持格式:BMP、GIF、JPEG、EXIF、PNG、TIFF、ICON、WMF、EMF等,几乎涵盖所有常用格式
图像类:
- Image类:Bitmap和Metafile的类提供功能的抽象基类。
- Metafile类:定义图形图元文件,图元文件包含描述一系列图形操作的记录,这些操作可以被记录(构造)和被回放(显示)
- Bitmap类:封装GDI+位图,此位图由图形图像及其属性的像素数据组成,Bitmap是用于处理由像素数据定义的图像的对象。
常用属性以及方法:
名称 | 说明 |
公共属性 | |
Height | 获取此Image对象的高度。 |
RawFormat | 获取此Image对象的格式。 |
Size | 获取此Image对象的宽度和高度。 |
Width | 获取此Image对象的宽度。 |
公共方法 | |
GetPixel | 获取此Bitmap中指定像素的颜色。 |
MakeTransparent | 使默认的透明颜色对此Bitmap透明。 |
RotateFlip | 旋转、翻转或者同事旋转和翻转Image对象。 |
Save | 将Image对象以指定的格式保存到指定的Stream对象。 |
SetPixel | 设置Bitmap对象中指定像素的颜色。 |
SetPropertyItem | 将指定的属性项设置为指定的值。 |
SetResolution | 设置此Bitmap的分辨率。 |
构造BitMap实例:
public Bitmap(Image ); //从现有图像创建,其中可换成等效参数 public Bitmap(int, int); public Bitmap(Image, bool );//bool:颜色校正标志位 public Bitmap(Type , string );//type提取资源的类, string 资源名 public Bitmap(int , int , PixelFormat );// PixelFormat像素格式 枚举 public Bitmap(int , int , Graphics);// Graphics设置分辨率 public Bitmap(int , int , int stride, PixelFormat , IntPtr );//stride 指定相邻扫描行开始处之间字节偏移量的整数。传递给此参数的值必须为4 的倍数。IntPtr指向包含像素数据的字节数组的指针。 |
PixelFormat枚举:
名称 | 说明 |
DontCare = 0 | 没有指定像素格式 |
Undefined = 0 | 未定义像素格式 |
Max = 15 | 此枚举的最大值 |
Indexed = 65536 | 该像素数据包含颜色索引值,这意味着这些值是系统颜色表中颜色的索引,而不是单个颜色值。 |
Gdi = 131072 | 像素数据包含 GDI 颜色 |
Format16bppRgb555 = 135173 | 指定格式为每像素 16 位;红色、绿色和蓝色分量各使用 5 位。剩余的 1 位未使用 |
Format16bppRgb565 = 135174 | 指定格式为每像素 16 位;红色分量使用 5 位,绿色分量使用 6 位,蓝色分量使用 5 位 |
Format24bppRgb = 137224 | 指定格式为每像素 24 位;红色、绿色和蓝色分量各使用 8 位 |
Format32bppRgb = 139273 | 指定格式为每像素 32 位;红色、绿色和蓝色分量各使用 8 位。剩余的 8 位未使用 |
Format1bppIndexed = 196865 | 指定像素格式为每像素 1 位,并指定它使用索引颜色。因此颜色表中有两种颜色 |
Format4bppIndexed = 197634 | 指定格式为每像素 4 位而且已创建索引 |
Format8bppIndexed = 198659 | 指定格式为每像素 8 位而且已创建索引。因此颜色表中有 256 种颜色 |
Alpha = 262144 | 像素数据包含没有进行过自左乘的 alpha 值 |
Format16bppArgb1555 = 397319 | 像素格式为每像素 16 位。该颜色信息指定 32,768 种色调,其中 5 位为红色,5 位为绿色,5 位为蓝色,1 位为 alpha |
PAlpha = 524288 | 像素格式包含自左乘的 alpha 值 |
Format32bppPArgb = 925707 | 指定格式为每像素 32 位;alpha、红色、绿色和蓝色分量各使用 8 位。根据 alpha 分量,对红色、绿色和蓝色分量进行自左乘 |
Extended = 1048576 | 保留 |
Format16bppGrayScale = 1052676 | 像素格式为每像素 16 位。该颜色信息指定 65536 种灰色调 |
Format48bppRgb = 1060876 | 指定格式为每像素 48 位;红色、绿色和蓝色分量各使用 16 位 |
Format64bppPArgb = 1851406 | 指定格式为每像素 64 位;alpha、红色、绿色和蓝色分量各使用 16 位。根据 alpha 分量,对红色、绿色和蓝色分量进行自左乘 |
Canonical = 2097152 | 默认像素格式,每像素 32 位。此格式指定 24 位颜色深度和一个 8 位 alpha 通道 |
Format32bppArgb = 2498570 | 指定格式为每像素 32 位;alpha、红色、绿色和蓝色分量各使用 8 位 |
Format64bppArgb = 3424269 | 指定格式为每像素 64 位;alpha、红色、绿色和蓝色分量各使用 16 位 |
图像的输入:
- 窗体设计时,在属性对话框里面的Image属性设置
- 程序中对话框输入
程序中对话框输入:(示例)
打开对话框:
OpenFileDialog ofdlg = newOpenFileDialog(); ofdlg.Filter = "BMP File(*.bmp)|*.bmp"; if (ofdlg.ShowDialog() == DialogResult.OK) { Bitmap image = newBitmap(ofdlg.FileName); } |
保存对话框:
string str; Bitmap box1 = newBitmap(pictureBox1.Image); SaveFileDialog sfdlg = newSaveFileDialog(); sfdlg.Filter = "bmp文件(*.BMP)|*.BMP|All File(*.*)|*.*"; sfdlg.ShowDialog(); str = sfdlg.FileName; box1.Save(str); |
关于OpenFileDialog与SaveFileDialog的用法,可参考msdn相关章节。
图像格式的转换:
Bitmap对象的Save方法中的第二个参数指定了图像保存的格式。修改这个参数可对图像格式进行转换。
位图支持的格式:Imaging.ImageFormat
名称 | 说明 |
Bmp | 获取位图图像格式(BMP)。 |
Emf | 获取增强型Windows图元文件图像格式(EMF)。 |
Exif | 获取可交换图像文件(Exif)格式。 |
Gif | 获取图形交换格式(GIF)图像格式。 |
Guid | 获取表示此ImageForma 对象的Guid结构。 |
Icon | 获取Windows图标图像格式。 |
Jpeg | 获取联合图像专家组(JPEG)图像格式。 |
MemoryBmp | 获取内存位图图像格式。 |
Png | 获取W3C可移植网络图形(PNG)图像格式。 |
Tiff | 获取标签图像文件格式(TIFF)图像格式。 |
Wmf | 获取Windows图元文件(WMF)图像格式。 |
图像的拷贝与粘贴Clipboard:
常用方法:
名称 | 说明 |
Clear | 从剪贴板中移除所有数据。 |
ContainsData | 指示剪贴板中是否存在指定格式的数据,或可转换成此格式的数据。 |
ContainsImage | 指示剪贴板中是否存在 Bitmap 格式或可转换成此格式的数据。 |
ContainsText | 已重载。指示剪贴板中是否存在文本数据。 |
GetData | 从剪贴板中检索指定格式的数据。 |
GetDataObject | 检索当前位于系统剪贴板中的数据。 |
GetFileDropList | 从剪贴板中检索文件名的集合。 |
GetImage | 检索剪贴板上的图像。 |
GetText | 已重载。从剪贴板中检索文本数据。 |
SetAudio | 已重载。将WaveAudio格式的数据添加到剪贴板中。 |
SetData | 将指定格式的数据添加到剪贴板中。 |
SetDataObject | 已重载。将数据置于系统剪贴板中。 |
SetImage | 将Bitmap格式的Image添加到剪贴板中。 |
SetText | 已重载。将文本数据添加到剪贴板中。 |
步骤:将数据置于剪贴板中。从剪贴板中检索 数据。
- 将数据置于剪贴板中
可以通过SetDataObject方法将数据置于剪贴板中,SetDataObject方法有以下三种形式的定义:
publicstaticvoid SetDataObject(object); publicstaticvoid SetDataObject(object, bool );//bool 程序退出时,是否保留在剪贴板中 publicstaticvoid SetDataObject(object, bool , int , int);//尝试次数及两次尝试之间的毫秒数 |
- 从剪贴板中检索数据
publicstaticIDataObject GetDataObject(); |
图像的颜色处理:
调整分辨率:所谓分辨率就是指画面的解析度,由多少像素构成,数值越大,图像也就越清晰。
算法说明:将n*n分辨率的图像变换为m*m分辨率方法是将源图像分成n/m*n/m的子图像块,然后将该n/m*n/m子图像块的所有像素的颜色按F(i,j)的颜色值进行设定,达到降低分辨率的目的。
调整色彩:
灰化:算法说明:将彩色图像像素的颜色值分解为三基色R、G、B,求其和的平均值,然后使用SetPixel方法以该平均值参数生成图像。
灰度图像处理:根据特定的输入输出灰度转换关系,增强了图像灰度,处理后图像的中等灰度值增大,图像变亮。
颜色名 | R值 | G值 | B值 |
红 | 255 | 0 | 0 |
蓝 | 0 | 0 | 255 |
绿 | 0 | 255 | 0 |
白 | 255 | 255 | 255 |
黄 | 255 | 255 | 0 |
黑 | 0 | 0 | 0 |
青 | 0 | 255 | 255 |
品红 | 255 | 0 | 255 |
颜色表:(RGB)