今天在CodeProject上找到这篇文章,还算实用,不敢独享,送给大家!
原文地址 示例下载 源码下载(VS2005)
简介 ... 概述 这篇文章的目的是构建一个图像处理功能的类而使每一个C#程序员都能够使用。因为使用C#能够非常灵活的进行图像处理。 我们知道,当基于计算来移动像素或改变像素值的代码稍微有点复杂。
应用
ImageHandler类负责图像处理的相关操作,如保存、图像关联操作等。功能包括:获取图片信息、 缩放、色彩滤镜、亮度、反向、灰度、转换、裁贴、和插入文字、其它图片或几何图形。 Paint方法使用AutoScoolPosition属性发现滚动位置,使用AutoScrollMinSize属性进行设置。
1.Color Filter(色相) 关于色相的说明: 从光学意义上讲,色相差别是由光波波长的长短产生的。即便是同一类颜色,也能分为几种色相,如黄颜色可以分为中黄、土黄、 柠檬黄等,灰颜色则可以分为红灰、蓝灰、紫灰等。光谱中有红、橙、黄、绿、蓝、紫六种基本色光,人的眼睛可以 分辨出约180种不同色相的颜色。 颜色过滤是依照颜色的光谱吸收类别:短波长、长波长、混合波长;合并或形状裁贴;单色或变色的。 详见:http://baike.baidu.com/view/122648.htm
这个比较简单,只需要增加或减少每种颜色的值即可。 使图片中的另外两种颜色值减去255即可。比如,红色相中,保持红色值不变,而对绿色和蓝色分别减去255即可。
-
C# code
-
///<summary>/// 设置色相 ///</summary>///<param name="colorFilterType">色相类型</param>publicvoid SetColorFilter(ColorFilterTypes colorFilterType) { Bitmap temp = (Bitmap)_currentBitmap; Bitmap bmap = (Bitmap)temp.Clone(); Color c; for (int i =0; i < bmap.Width; i++) { for (int j =0; j < bmap.Height; j++) { c = bmap.GetPixel(i, j); int nPixelR =0; int nPixelG =0; int nPixelB =0; if (colorFilterType == ColorFilterTypes.Red) { nPixelR = c.R; nPixelG = c.G -255; nPixelB = c.B -255; } elseif (colorFilterType == ColorFilterTypes.Green) { nPixelR = c.R -255; nPixelG = c.G; nPixelB = c.B -255; } elseif (colorFilterType == ColorFilterTypes.Blue) { nPixelR = c.R -255; nPixelG = c.G -255; nPixelB = c.B; } nPixelR = Math.Max(nPixelR, 0); nPixelR = Math.Min(255, nPixelR); nPixelG = Math.Max(nPixelG, 0); nPixelG = Math.Min(255, nPixelG); nPixelB = Math.Max(nPixelB, 0); nPixelB = Math.Min(255, nPixelB); bmap.SetPixel(i, j, Color.FromArgb((byte)nPixelR, (byte)nPixelG, (byte)nPixelB)); } } _currentBitmap = (Bitmap)bmap.Clone(); }
2.Gamma(曲线) Gamma源于CRT(显示器/电视机)的响应曲线,即其亮度与输入电压的非线性关系。 Gamma 校正补偿了不同输出设备存在的颜色显示差异,从而使图像在不同的监视器上呈现出相同的效果。 详见 :http://baike.baidu.com/view/476857.htm
-
C# code
-
/// <summary> /// 曲线 /// </summary> /// <param name="red"> 红 </param> /// <param name="green"> 绿 </param> /// <param name="blue"> 蓝 </param> public void SetGamma( double red, double green, double blue) { Bitmap temp = (Bitmap)_currentBitmap; Bitmap bmap = (Bitmap)temp.Clone(); Color c; byte [] redGamma = CreateGammaArray(red); byte [] greenGamma = CreateGammaArray(green); byte [] blueGamma = CreateGammaArray(blue); for ( int i = 0 ; i < bmap.Width; i ++ ) { for ( int j = 0 ; j < bmap.Height; j ++ ) { c = bmap.GetPixel(i, j); bmap.SetPixel(i, j, Color.FromArgb(redGamma[c.R], greenGamma[c.G], blueGamma[c.B])); } } _currentBitmap = (Bitmap)bmap.Clone(); } /// <summary> /// 获取曲线数组 /// </summary> /// <param name="color"> 色彩 </param> /// <returns> 数组 </returns> private byte [] CreateGammaArray( double color) { byte [] gammaArray = new byte [ 256 ]; for ( int i = 0 ; i < 256 ; ++ i) { gammaArray[i] = ( byte )Math.Min( 255 , ( int )(( 255.0 * Math.Pow(i / 255.0 , 1.0 / color)) + 0.5 )); } return gammaArray; }3. Brightness(亮度) 一种颜色的范围,表示它与一系列从很昏暗(黑)到很明亮(耀眼)的无色彩的颜色之间的相似处。 取值范围为-255到255之间。
-
C# code
-
/// <summary> /// 设置亮度 /// </summary> /// <param name="brightness"> 亮度,-255到+255之间的数值 </param> public void SetBrightness( int brightness) { Bitmap temp = (Bitmap)_currentBitmap; Bitmap bmap = (Bitmap)temp.Clone(); if (brightness < - 255 ) brightness = - 255 ; if (brightness > 255 ) brightness = 255 ; Color c; for ( int i = 0 ; i < bmap.Width; i ++ ) { for ( int j = 0 ; j < bmap.Height; j ++ ) { c = bmap.GetPixel(i, j); int cR = c.R + brightness; int cG = c.G + brightness; int cB = c.B + brightness; if (cR < 0 ) cR = 1 ; if (cR > 255 ) cR = 255 ; if (cG < 0 ) cG = 1 ; if (cG > 255 ) cG = 255 ; if (cB < 0 ) cB = 1 ; if (cB > 255 ) cB = 255 ; bmap.SetPixel(i, j, Color.FromArgb(( byte )cR, ( byte )cG, ( byte )cB)); } } _currentBitmap = (Bitmap)bmap.Clone(); }
-
C# code
-
/// <summary> /// 设置对比度 /// </summary> /// <param name="contrast"> 对比度,-100到+100之间的数值 </param> public void SetContrast( double contrast) { Bitmap temp = (Bitmap)_currentBitmap; Bitmap bmap = (Bitmap)temp.Clone(); if (contrast < - 100 ) contrast = - 100 ; if (contrast > 100 ) contrast = 100 ; contrast = ( 100.0 + contrast) / 100.0 ; contrast *= contrast; Color c; for ( int i = 0 ; i < bmap.Width; i ++ ) { for ( int j = 0 ; j < bmap.Height; j ++ ) { c = bmap.GetPixel(i, j); double pR = c.R / 255.0 ; pR -= 0.5 ; pR *= contrast; pR += 0.5 ; pR *= 255 ; if (pR < 0 ) pR = 0 ; if (pR > 255 ) pR = 255 ; double pG = c.G / 255.0 ; pG -= 0.5 ; pG *= contrast; pG += 0.5 ; pG *= 255 ; if (pG < 0 ) pG = 0 ; if (pG > 255 ) pG = 255 ; double pB = c.B / 255.0 ; pB -= 0.5 ; pB *= contrast; pB += 0.5 ; pB *= 255 ; if (pB < 0 ) pB = 0 ; if (pB > 255 ) pB = 255 ; bmap.SetPixel(i, j, Color.FromArgb(( byte )pR, ( byte )pG, ( byte )pB)); } } _currentBitmap = (Bitmap)bmap.Clone(); }5. Grayscale(灰度) 灰度使用黑色调表示物体。 每个灰度对象都具有从 0%(白色)到 100%(黑色)的亮度值。 使用黑白或灰度扫描仪生成的图像通常以灰度显示。
-
C# code
-
/// <summary> /// 设置灰度 /// </summary> public void SetGrayscale() { Bitmap temp = (Bitmap)_currentBitmap; Bitmap bmap = (Bitmap)temp.Clone(); Color c; for ( int i = 0 ; i < bmap.Width; i ++ ) { for ( int j = 0 ; j < bmap.Height; j ++ ) { c = bmap.GetPixel(i, j); byte gray = ( byte )(. 299 * c.R + . 587 * c.G + . 114 * c.B); bmap.SetPixel(i, j, Color.FromArgb(gray, gray, gray)); } } _currentBitmap = (Bitmap)bmap.Clone(); }
用255减去每个色彩元素的值。例如,当前像素红色为00,则设置其值为FF(FF=255-0)。-
C# code
-
/// <summary> /// 底片 /// </summary> public void SetInvert() { Bitmap temp = (Bitmap)_currentBitmap; Bitmap bmap = (Bitmap)temp.Clone(); Color c; for ( int i = 0 ; i < bmap.Width; i ++ ) { for ( int j = 0 ; j < bmap.Height; j ++ ) { c = bmap.GetPixel(i, j); bmap.SetPixel(i, j, Color.FromArgb( 255 - c.R, 255 - c.G, 255 - c.B)); } } _currentBitmap = (Bitmap)bmap.Clone(); }
-
C# code
-
/// <summary> /// 缩放 /// </summary> /// <param name="newWidth"> 宽 </param> /// <param name="newHeight"> 高 </param> public void Resize( int newWidth, int newHeight) { if (newWidth != 0 && newHeight != 0 ) { Bitmap temp = (Bitmap)_currentBitmap; Bitmap bmap = new Bitmap(newWidth, newHeight, temp.PixelFormat); double nWidthFactor = ( double )temp.Width / ( double )newWidth; double nHeightFactor = ( double )temp.Height / ( double )newHeight; double fx, fy, nx, ny; int cx, cy, fr_x, fr_y; Color color1 = new Color(); Color color2 = new Color(); Color color3 = new Color(); Color color4 = new Color(); byte nRed, nGreen, nBlue; byte bp1, bp2; for ( int x = 0 ; x < bmap.Width; ++ x) { for ( int y = 0 ; y < bmap.Height; ++ y) { fr_x = ( int )Math.Floor(x * nWidthFactor); fr_y = ( int )Math.Floor(y * nHeightFactor); cx = fr_x + 1 ; if (cx >= temp.Width) cx = fr_x; cy = fr_y + 1 ; if (cy >= temp.Height) cy = fr_y; fx = x * nWidthFactor - fr_x; fy = y * nHeightFactor - fr_y; nx = 1.0 - fx; ny = 1.0 - fy; color1 = temp.GetPixel(fr_x, fr_y); color2 = temp.GetPixel(cx, fr_y); color3 = temp.GetPixel(fr_x, cy); color4 = temp.GetPixel(cx, cy); // Blue bp1 = ( byte )(nx * color1.B + fx * color2.B); bp2 = ( byte )(nx * color3.B + fx * color4.B); nBlue = ( byte )(ny * ( double )(bp1) + fy * ( double )(bp2)); // Green bp1 = ( byte )(nx * color1.G + fx * color2.G); bp2 = ( byte )(nx * color3.G + fx * color4.G); nGreen = ( byte )(ny * ( double )(bp1) + fy * ( double )(bp2)); // Red bp1 = ( byte )(nx * color1.R + fx * color2.R); bp2 = ( byte )(nx * color3.R + fx * color4.R); nRed = ( byte )(ny * ( double )(bp1) + fy * ( double )(bp2)); bmap.SetPixel(x, y, System.Drawing.Color.FromArgb( 255 , nRed, nGreen, nBlue)); } } _currentBitmap = (Bitmap)bmap.Clone(); } }8. Rotating and Flipping(镜像)
-
C# code
-
/// <summary> /// 翻转 /// </summary> /// <param name="rotateFlipType"> 图像的旋转方向和用于翻转图像的轴。 </param> public void RotateFlip(RotateFlipType rotateFlipType) { Bitmap temp = (Bitmap)_currentBitmap; Bitmap bmap = (Bitmap)temp.Clone(); bmap.RotateFlip(rotateFlipType); _currentBitmap = (Bitmap)bmap.Clone(); }
-
C# code
-
/// <summary> /// 裁剪 /// </summary> /// <param name="xPosition"> X起始点 </param> /// <param name="yPosition"> Y起始点 </param> /// <param name="width"> 宽 </param> /// <param name="height"> 高 </param> public void DrawOutCropArea( int xPosition, int yPosition, int width, int height) { _bitmapPrevCropArea = (Bitmap)_currentBitmap; Bitmap bmap = (Bitmap)_bitmapPrevCropArea.Clone(); Graphics gr = Graphics.FromImage(bmap); Brush cBrush = new Pen(Color.FromArgb( 150 , Color.White)).Brush; Rectangle rect1 = new Rectangle( 0 , 0 , _currentBitmap.Width, yPosition); Rectangle rect2 = new Rectangle( 0 , yPosition, xPosition, height); Rectangle rect3 = new Rectangle( 0 , (yPosition + height), _currentBitmap.Width, _currentBitmap.Height); Rectangle rect4 = new Rectangle((xPosition + width), yPosition, (_currentBitmap.Width - xPosition - width), height); gr.FillRectangle(cBrush, rect1); gr.FillRectangle(cBrush, rect2); gr.FillRectangle(cBrush, rect3); gr.FillRectangle(cBrush, rect4); _currentBitmap = (Bitmap)bmap.Clone(); }
-
C# code
-
/// <summary> /// 裁剪 /// </summary> /// <param name="xPosition"> X点位置 </param> /// <param name="yPosition"> Y点位置 </param> /// <param name="width"> 宽度 </param> /// <param name="height"> 高度 </param> public void Crop( int xPosition, int yPosition, int width, int height) { Bitmap temp = (Bitmap)_currentBitmap; Bitmap bmap = (Bitmap)temp.Clone(); if (xPosition + width > _currentBitmap.Width) width = _currentBitmap.Width - xPosition; if (yPosition + height > _currentBitmap.Height) height = _currentBitmap.Height - yPosition; Rectangle rect = new Rectangle(xPosition, yPosition, width, height); _currentBitmap = (Bitmap)bmap.Clone(rect, bmap.PixelFormat); }
-
-
-