7-1第1章VC#图像处理学习内容与要点:本章介绍VC#图像处理基础、图像文件的打开、保存方法及图像的移动、尺寸变换、分辨率变换等操作的基本知识和处理技巧。主要有:VC#图像处理基础图像文件的打开和保存图像的拷贝和粘贴图像的放大和缩小图像的分辨率变换等。技术要点:Clipboard对象的使用SystemImage方法的使用1.1VC#图像处理基础1.1.1VisualC#图像处理组件使用CDI+可以显示和处理多种格式的图像文件。使用Windows窗体PictureBox控件,可以在设计时将Image属性设置为有效图片,从而在窗体上加载和显示图片。可使用的图像文件类型如表7-1所示。表7-1图像文件类型类型文件扩展名位图.bmpIcon.icoGIF.gif图元文件.wmfJPEG.jpg1.1.2Bitmap对象Bitmap对象是用于处理由像素数据定义的图像的对象。对图像文件进行处理的类主要为Bitmap类和ImageAttributes类,Bitmap类属于System.Drawing命名空间,该命名空间提供了对GDI+基本图形功能的访问。Bitmap类封装GDI+位图,此位图由图形图像及其属性的像素数据组成。Bitmap的常用方法和属性如表7-2所示。表7-2Bitmap的常用方法和属性公共属性属性说明Flags获取此Image对象的属性标记。7-2FrameDimensionsList获取GUID的数组.Height获取此Image对象的高度。HorizontalResolution获取此Image对象的水平分辨率.Palette获取或设置用于此Image对象的调色板。PhysicalDimension获取此Image对象的宽度和高度。PixelFormat获取此Image对象的像素格式。PropertyIdList获取存储在此Image对象中的属性ID的数组。RawFormat获取此Image对象的格式。Size获取此Image对象的宽度和高度。VerticalResolution获取此Image对象的垂直分辨率。Width获取此Image对象的宽度。公共方法方法说明Clone已重载。创建此Bitmap部分的副本。Equals确定两个Object实例是否相等。FromResource从指定的Windows资源创建Bitmap对象。GetEncoderParameterList返回有关指定的图像编码器所支持的参数的信息。GetFrameCount返回指定维度的帧数。GetPixel获取此Bitmap中指定像素的颜色。GetPropertyItem从该Image对象获取指定的属性项。GetThumbnailImage返回此Image对象的缩略图。GetType获取当前实例的Type。LockBits将Bitmap对象锁定到系统内存中。MakeTransparent使默认的透明颜色对此Bitmap透明。RotateFlip旋转、翻转或者同时旋转和翻转Image对象。Save将Image对象以指定的格式保存到指定的Stream对象。SaveAdd将指定的Image对象中的信息添加到此Image对象中。SelectActiveFrame选择由维度和索引指定的帧。SetPixel设置Bitmap对象中指定像素的颜色。SetPropertyItem将指定的属性项设置为指定的值。SetResolution设置此Bitmap的分辨率。ImageAttributes类属于System.Drawing.Imaging命名空间。它有许多可用于在在图像处理过程中修改图像的属性。ImageAttributes的基本方法和属性如表7-3所示。表7-23ImageAttributes的基本方法和属性公共方法方法说明ClearBrushRempTable清除Brush对象颜色重新映射表。ClearColorKey清除ColorAdjustType枚举指定的GDI+对象的颜色7-3键值。ClearColorMatrix颜色调整矩阵清零。ClearGamma清除ColorAdjustType枚举指定的GDI+对象的伽玛值。ClearNoOp清除所有GDI+对象的NoOp设置。ClearOutputChannel清除ColorAdjustType枚举指定的GDI+对象的输出信道选择。ClearOutputChannelColorProfile清除ColorAdjustType枚举指定的GDI+对象的输出信道选择和颜色配置文件。ClearRemapTable清除ColorAdjustType枚举指定的GDI+对象的颜色重新映射表。ClearThreshold清除所有相关的GDI+对象的阈值。Clone创建该ImageAttributes对象的一个精确副本。Dispose释放ImageAttributes对象使用的所有资源。Equals确定两个Object实例是否相等。GetAdjustedPalette获取调整颜色后的调色板。GetHashCode在哈希算法和数据结构(如哈希表)中使用的特定类型的哈希函数。GetType获取当前实例的Type。SetBrushRemapTable设置重新映射表以转换Brush颜色。SetColorKey为ColorAdjustType枚举指定的GDI+对象设置低颜色值和高颜色值。SetColorMatrices为图像颜色设置颜色调整矩阵,并为灰度值设置单独的灰度调整矩阵。提供颜色矩阵标志。SetColorMatrix将5x5颜色调整矩阵设置为具有指定ColorMatrixFlag枚举的指定Matrix对象。SetGamma为所有GDI+对象设置伽玛值。SetNoOp为ColorAdjustType枚举指定的GDI+对象设置NoOp校正值。SetOutputChannel依据ColorChannelFlag枚举的指定,为所有相关的GDI+对象设置输出颜色通道。SetOutputChannelColorProfile使用字符串中指定的颜色配置文件,为所有GDI+对象设置输出颜色通道。SetRemapTable按照ColorMap对象的指定,为ColorAdjustType枚举指定的GDI+对象设置重新映射表。SetThreshold为所有适当的GDI+对象设置双级映射阈值。SetWrapMode只设置环绕模式。ToString返回表示当前Object的String。使用ImageAttributes制作半透明图像的程序例子如下:Graphicsg=this.pictureBox1.CreateGraphics();stringpath=@C:\DocumentsandSettings\Administrator\MyDocuments\MyPictures\7-4样品.jpg;//创建Bitmap对象并使用“样品.jpg”图像加载//初始化颜色矩阵//注意第4行、4列的值为0.8Bitmapbitmap=newBitmap(path);float[][]matrixItems={newfloat[]{1,0,0,0,0},newfloat[]{0,1,0,0,0},newfloat[]{0,0,1,0,0},newfloat[]{0,0,0,0.8f,0},newfloat[]{0,0,0,0,1}};ColorMatrixcolorMatrix=newColorMatrix(matrixItems);//创建ImageAttributes对象并且设置它的颜色矩阵ImageAttributesimageAtt=newImageAttributes();imageAtt.SetColorMatrix(colorMatrix,ColorMatrixFlag.Default,ColorAdjustType.Bitmap);intiWidth=bitmap.Width;intiHeight=bitmap.Height;//首先,绘一较宽的黑线g.DrawLine(newPen(Color.Black,25),newPoint(10,35),newPoint(200,35));//绘半透明的Bitmap图像g.DrawImage(bitmap,newRectangle(30,0,iWidth,iHeight),0,0,iWidth,iHeight,GraphicsUnit.Pixel,imageAtt);在这个程序中,ImageAttributes对象将所有的alpha值设置为其原始值得80%。方法是通过初始化一个颜色矩阵并将矩阵中的alpha缩放值设置为0.8来实现的。颜色矩阵的地址被传递给ImageAttributes对象的SetColorMatrix方法,ImageAttributes对象被传递给Graphics对象的DrawImage方法。程序运行结果如图1-1所示。在显示过程中,位图中的各个alpha值被转换成其原始值的80%,这将出现与背景相混合的图像。从图1-1中看到,位图图像看上去是透明的,透过图像可看到一个纯黑的宽线条。7-5图1-1使用ImageAttributes对象的例子1.1.3图像的颜色(Color)系统对图像进行处理时用GetPixel获取此Bitmap中指定像素的颜色。这些颜色是由(R,G,B)三基色和(A)透明度组成的。获取颜色值的具体方法为:(1)定义BitmapBitmapmyBitmap=newBitmap(C:\MyImages\TestImage.bmp);(2)在程序中输入myBitmap.后系统会自动弹处bitmap的所有属性,在这里我们使用GetPixel属性来获得颜色值,如图1-2所示。图1-2用GetPixel属性来获得颜色值(3)定义一个颜色变量把在指定位置所取得的像素值存入颜色变量中Colorc=newColor();c=mybitmap.GetPixel(10,10);(4)对颜色值进行分解分解出单色分量值,如图1-3所示。7-6图1-3颜色分解颜色的基本属性如表7-4所示。表7-4颜色的基本属性方法说明A获取此Color结构的alpha分量值。取值(0—255)B获取此Color结构的蓝色分量值。取值(0—255)G获取此Color结构的绿色分量值。取值(0—255)R获取此Color结构的红色分量值。取值(0—255)Name获取此Color名称的名称。这将返回用户定义的颜色的名称或已知颜色的名称(如果该颜色是从某个名称创建的)。对于自定义颜色,将返回RGB值。颜色的基本方法如表7-5所示。表7-5颜色的基本方法方法说明Equals测试指定的对象是否为Color结构并等效于此Color结构。FromArgb从四个8位ARGB分量(alpha、红色、绿色和蓝色)值创建Color结构。FromKnownColor从指定的预定义颜色创建一个Color结构。FromName从预定义颜色的指定名称创建一个Color结构。GetBrightness获取此Color结构的“色调-饱和度-亮度”(HSB)的亮度值。GetHashCode返回此Color结构的哈希代码。GetHue获取此Color结构的“色调-饱和度-亮度”(HSB)的色调值,以度为单位。GetSaturation获取此Color结构的“色调-饱和度-亮度”(HSB)的饱和度值。GetType获取当前实例的Type。ToArgb获取此Color结构的32位ARGB值。ToKnownColor获取此Color结构的KnownColor值。3.2图像的输入和保存7-71.2.1图像的输入在窗体或图形框内输入图像有两种方式:一是在窗体设计时使用对象的Image属性输入,二是在程序中使用通用输入对话框输入。1.窗体设计时使用对象的Image属性输入窗体设计时使用对象的Image属性输入图像的操作如下:(1)选择对象属性中的Image属性。例如,在窗体内输入图像时,如图1-4所示。图1-4属性对话框(2)单