C#中基于GDI+Graphics图像处理系列之前言_第1页
C#中基于GDI+Graphics图像处理系列之前言_第2页
C#中基于GDI+Graphics图像处理系列之前言_第3页
C#中基于GDI+Graphics图像处理系列之前言_第4页
C#中基于GDI+Graphics图像处理系列之前言_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C#中基于GDI+(Graphics)图像处理系列之前言前言图像处理是开发工程师们学习某种语言入门时就会遇到的问题,笔者刚开始接触C#使用GDI+进行图像处理,觉得太简单了,就没有深入研究,随着工作经验的积累,踏遍若干坑以后突然觉得还是有必要将这块的知识好好总结一下,毕竟还是有一些比较冷门的知识在实际应用中给我们的程序带来更多的灵活性,比如将图片保存成jpeg时进一步控制图片的质量、怎样获取任意角度旋转后的图像、怎样获取透明图像等等。本文后面将直接放出图像处理工具类的全部源码和示例程序源码,供有一定开发能力的同学直接获取并使用。需要深入了解代码的同学可以根据以下章节详细了解功能点的实现,会详细

2、说明获取高质量缩略图的要领、图像旋转的实现步骤等重要内容。图像处理工具类的全部源码/*Copyright(C)Corporation.Allrightsreserved.*Author:lihaitao* Email:lhtzbj12* CreateDate:2016-8-15* Description:图片处理工具,包括固定宽高、限制宽高、限制长边、文字水印图片水印(透明、任意角度旋转)(透明)、* RevisionHistory:* DateAuthor* 2016-8-15lihaitao*Descriptioncreate*/usingSystem;usingSystem.Collec

3、tions.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Drawing;usingSystem.Drawing.Drawing2D;usingSystem.Drawing.Imaging;usingSystem.IO;usingSystem.Runtime.InteropServices;namespaceSDLight.Util(publicpartialclassImageTool(#region变量优化良好的图片每个像素平均占用文件大小,经验值,可根据需要修改priva

4、testaticreadonlydoublesizePerPx=0.18;#endregion#region生成高质量缩略图、优化图片/生成高质量缩略图(固定宽高),不一定保持原宽高比/目标保存路径/源文件路径/生成缩略图的宽度,设置为0,则与源图比处理/生成缩略图的高度,设置为0,则与源图等比例处理/1100整数,无效值则取默认值95/如image/jpegpublicboolGetThumbnailImage(stringdestPath,stringsrcPath,intdestWidth,intdestHeight,intquality,outstringerror,stringmim

5、eType=image/jpeg)(boolretVal=false;error=string.Empty;宽高不能小于0if(destWidth0|destHeight0)(error=目标宽高不能小于0;returnretVal;)宽高不能同时为0if(destWidth=0&destHeight=0)(error=目标宽高不能同时为0;returnretVal;)ImagesrcImage=null;ImagedestImage=null;Graphicsgraphics=null;try(获取源图像srcImage=Image.FromFile(srcPath,false);计算高宽比

6、例floatd=(float)srcImage.Height/srcImage.Width;如果输入的宽为0,则按高度等比缩放if(destWidth=0)destWidth=Convert.ToInt32(destHeight/d);如果输入的高为0,则按宽度等比缩放if(destHeight=0)destHeight=Convert.ToInt32(destWidth*d);定义画布destImage=newBitmap(destWidth,destHeight);获取高清Graphicsgraphics=GetGraphics(destImage);将源图像画到画布上,注意最后一个参数G

7、raphicsUnit.Pixelgraphics.DrawImage(srcImage,newRectangle(0,0,destWidth,destHeight),newRectangle(0,0,srcImage.Width,srcImage.Height),GraphicsUnit.Pixel);/如果是覆盖则先释放源资源if(destPath=srcPath)srcImage.Dispose();/保存到文件,同时进一步控制质量SaveImage2File(destPath,destImage,quality,mimeType);retVal=true;catch(Exception

8、ex)error=ex.Message;finallyif(srcImage!=null)srcImage.Dispose();if(destImage!=null)destImage.Dispose();if(graphics!=null)graphics.Dispose();returnretVal;/对图片进行压缩优化(限制宽高),始终保持原宽高比Ill/目标保存路径Ill源文件路径/压缩后的图片宽度不大于这值,如果为0,表示不限制宽度/压缩后的图片高度不大于这值,如果为0,表示不限制高度/1100整数,无效值则取默认值95/如image/jpegpublicboolGetCompres

9、sImage(stringdestPath,stringsrcPath,intmaxWidth,intmaxHeight,intquality,outstringerror,stringmimeType=image/jpeg)(boolretVal=false;error=string.Empty;宽高不能小于0if(maxWidth0|maxHeightmaxWidth)(destWidth=maxWidth;)/如果输入的最大宽为0,则不限制宽度/如果不为0,且原图高度大于该值,则附值为最大高度if(maxHeight!=0&destHeightmaxHeight)(destHeight=

10、maxHeight;floatsrcD=(float)srcImage.Height/srcImage.Width;floatdestD=(float)destHeight/destWidth;目的高宽比大于原高宽比即目的高偏大,因此按照原比例计算目的高度if(destDsrcD)destHeight=Convert.ToInt32(destWidth*srcD);)elseif(destDsrcD)/目的高宽比小于原高宽比即目的宽偏大,因此按照原比例计算目的宽度destWidth=Convert.ToInt32(destHeight/srcD);)/如果维持原宽高,则判断是否需要优化if(d

11、estWidth=srcImage.Width&destHeight=srcImage.Height&fileInfo.LengthdestWidth*destHeight*sizePerPx)error=图片不需要压缩优化;returnretVal;)定义画布destImage=newBitmap(destWidth,destHeight);获取高清Graphicsgraphics=GetGraphics(destImage);将源图像画到画布上,注意最后一个参数GraphicsUnit.Pixelgraphics.DrawImage(srcImage,newRectangle(0,0,de

12、stWidth,destHeight),newRectangle(0,0,srcImage.Width,srcImage.Height),GraphicsUnit.Pixel);/如果是覆盖则先释放源资源if(destPath=srcPath)srcImage.Dispose();)/保存到文件,同时进一步控制质量SaveImage2File(destPath,destImage,quality,mimeType);retVal=true;)catch(Exceptionex)error=ex.Message;)finallyif(srcImage!=null)srcImage.Dispose

13、();if(destImage!=null)destImage.Dispose();if(graphics!=null)graphics.Dispose();returnretVal;/对图片进行压缩优化,始终保持原宽高比,限制长边长度,常用场景:相片/目标保存路径/源文件路径/压缩后的图片边(宽或者高)长变不大于这值,为0表示不限制/1100整数,无效值,则取默认值95/如image/jpegpublicboolGetCompressImage(stringdestPath,stringsrcPath,intmaxLength,intquality,outstringerror,string

14、mimeType=image/jpeg)(boolretVal=false;error=string.Empty;/最大边长不能小于0if(maxLength0)(原高宽比floatsrcD=(float)srcImage.Height/srcImage.Width;如果宽高,且大于限制if(destWidthdestHeight&destWidthmaxLength)destWidth=maxLength;destHeight=Convert.ToInt32(destWidth*srcD);)elseif(destHeightmaxLength)destHeight=maxLength;de

15、stWidth=Convert.ToInt32(destHeight/srcD);)/如果维持原宽高,则判断是否需要优化if(destWidth=srcImage.Width&destHeight=srcImage.Height&fileInfo.LengthdestWidth*destHeight*sizePerPx)error=图片不需要压缩优化;returnretVal;)定义画布destImage=newBitmap(destWidth,destHeight);获取高清Graphicsgraphics=GetGraphics(destImage);将源图像画到画布上,注意最后一个参数G

16、raphicsUnit.Pixelgraphics.DrawImage(srcImage,newRectangle(0,0,destWidth,destHeight),newRectangle(0,0,srcImage.Width,srcImage.Height),GraphicsUnit.Pixel);/如果是覆盖则先释放源资源if(destPath=srcPath)srcImage.Dispose();)/保存到文件,同时进一步控制质量SaveImage2File(destPath,destImage,quality,mimeType);retVal=true;)catch(Excepti

17、onex)error=ex.Message;)finallyif(srcImage!=null)srcImage.Dispose();if(destImage!=null)destImage.Dispose();if(graphics!=null)graphics.Dispose();returnretVal;#endregion#region从图片中挖取一块区域/从源图片中挖取一块区域保存为新图片/保存路径/源路径,两个路径可以相同,相同则会覆盖源图片/挖取区域左上角x值/挖取区域左上角y值/挖取区域的宽度/挖取区域的高度/1100整数,无效值,则取默认值95/publicboolGetDi

18、gImage(stringdestPath,stringsrcPath,intx,inty,intwidth,intheight,intquality,outstringerror,stringmimeType=image/jpeg)(boolretVal=false;error=string.Empty;ImagesrcImage=null;ImagedestImage=null;Graphicsgraphics=null;try(/获取源图像srcImage=Image.FromFile(srcPath,false);定义画布destImage=newBitmap(width,height

19、);获取高清Graphicsgraphics=GetGraphics(destImage);将源图像的某区域画到新画布上,注意最后一个参数GraphicsUnit.Pixelgraphics.DrawImage(srcImage,newRectangle(0,0,width,height),newRectangle(x,y,width,height),GraphicsUnit.Pixel);/如果是覆盖则先释放源资源if(destPath=srcPath)srcImage.Dispose();/保存到文件,同时进一步控制质量SaveImage2File(destPath,destImage,q

20、uality,mimeType);retVal=true;catch(Exceptionex)error=ex.Message;finallyif(srcImage!=null)srcImage.Dispose();if(destImage!=null)destImage.Dispose();if(graphics!=null)graphics.Dispose();returnretVal;#endregion#region在图片加入文字水印或者图片水印,并控制水印透明度,图片水印还可以控制旋转角度/给图片加入文字水印,且设置水印透明度/保存地址/源文件地址,如果想覆盖源图片,两个地址参数一定

21、要一样/文字/字体,为空则使用默认,注意,在创建字体时GraphicsUnit.Pixel/刷子,为空则使用默认/设置水印位置,1左上,2中上,3右上/4左中,5中,6右中/7左下,8中下,9右下/跟css里的padding个意思/1100整数,无效值,则取默认值95/不透明度100为完全不透明,0为完全透明IllIIIIllpublicboolDrawWaterText(stringdestPath,stringsrcPath,stringtext,Fontfont,Brushbrush,intpos,intpadding,intquality,intopcity,outstringerro

22、r,stringmimeType=imageljpeg)(boolretVal=false;error=string.Empty;ImagesrcImage=null;ImagedestImage=null;Graphicsgraphics=null;if(font=null)(font=newFont(微软雅黑,20,FontStyle.Bold,GraphicsUnit.Pixel);II统一尺寸)if(brush=null)(brush=newSolidBrush(Color.White);)try(II获取源图像srcImage=Image.FromFile(srcPath,false

23、);II定义画布,大小与源图像一样destImage=newBitmap(srcImage);获取高清Graphicsgraphics=GetGraphics(destImage);将源图像画到画布上,注意最后一个参数GraphicsUnit.Pixelgraphics.DrawImage(srcImage,newRectangle(0,0,destImage.Width,destImage.Height),newRectangle(0,0,srcImage.Width,srcImage.Height),GraphicsUnit.Pixel);II如果水印字不为空,且不透明度大于0,则画水印i

24、f(!string.IsNullOrEmpty(text)&opcity0)(II获取可以用来绘制水印图片的有效区域RectanglevalidRect=newRectangle(padding,padding,srcImage.Width-padding*2,srcImage.Height-padding*2);II获取绘画水印文字的格式,即文字对齐方式StringFormatformat=GetStringFormat(pos);II如果不透明度=100,那么直接将字画到当前画布上.if(opcity=100)(graphics.DrawString(text,font,brush,val

25、idRect,format);)else(如果不透明度在0到100之间,就要实现透明效果,文字没法透明,图片才能透明destImage一样大,则先将字画到一块临时画布,临时画布与先将字写到这块画布上,再将临时画布画到主画布上,同时设置透明参数BitmaptransImg=null;GraphicsgForTransImg=null;try(/定义临时画布transImg=newBitmap(destImage);/获取高清GraphicsgForTransImg=GetGraphics(transImg);绘制文字gForTransImg.DrawString(text,font,brush,

26、validRect,format);/*获取带有透明度的ImageAttributesImageAttributesimageAtt=GetAlphaImgAttr(opcity);将这块临时画布画在主画布上graphics.DrawImage(transImg,newRectangle(0,0,destImage.Width,destImage.Height),0,0,transImg.Width,transImg.Height,GraphicsUnit.Pixel,imageAtt);)catch(Exceptionex)(error=ex.Message;returnretVal;)fi

27、nally(if(transImg!=null)transImg.Dispose();if(gForTransImg!=null)gForTransImg.Dispose();)/如果两个地址相同即覆盖,则提前Dispose源资源if(destPath.ToLower()=srcPath.ToLower()(srcImage.Dispose();)/保存到文件,同时进一步控制质量SaveImage2File(destPath,destImage,quality,mimeType);retVal=true;catch(Exceptionex)error=ex.Message;finallyif(

28、srcImage!=null)srcImage.Dispose();if(destImage!=null)destImage.Dispose();if(graphics!=null)graphics.Dispose();returnretVal;/给图片加入图片水印,且设置水印透明度,旋转角度/保存地址/源文件地址,如果想覆盖源图片,两个地址参数一定要一样/水印图片地址/设置水印位置,1左上,2中上,3右上/4左中,5中,6右中/7左下,8中下,9右下/跟css里的padding个意思/1100整数,无效值,则取默认值95/不透明度100为完全不透明,0为完全透明/顺时针旋转角度/public

29、boolDrawWaterImage(stringdestPath,stringsrcPath,stringwaterPath,intpos,intpadding,intquality,intopcity,intangle,outstringerror,stringmimeType=image/jpeg)boolretVal=false;error=string.Empty;ImagesrcImage=null;ImagewaterImage=null;ImagedestImage=null;Graphicsgraphics=null;try(获取原图srcImage=Image.FromFi

30、le(srcPath,false);/获取水印图片waterimage=Image.FromFile(waterPath,false);varwaterRect=newRectangle(0,0,waterimage.Width,waterimage.Height);定义画布destimage=newBitmap(srcimage);获取高清Graphicsgraphics=GetGraphics(destimage);/将源图画到画布上graphics.Drawimage(srcimage,newRectangle(0,0,destimage.Width,destimage.Height),

31、newRectangle(0,0,srcimage.Width,srcimage.Height),GraphicsUnit.Pixel);/不透明度大于0,则画水印if(opcity0)(/获取可以用来绘制水印图片的有效区域RectanglevalidRect=newRectangle(padding,padding,srcimage.Width-padding*2,srcimage.Height-padding*2);如果要进行旋转if(angle!=0)(imagerotateimage=null;try(/获取水印图像旋转后的图像rotateimage=GetRotateimage(wa

32、terimage,angle);if(rotateimage!=null)(/漩转后图像的矩形区域varrotateRect=newRectangle(0,0,rotateimage.Width,rotateimage.Height);计算水印图片的绘制位置vardestRect=GetRectangleByPostion(validRect,rotateRect,pos);/如果不透明度=100,那么直接将水印画到当前画布上.if(opcity=100)(graphics.Drawimage(rotateimage,destRect,rotateRect,GraphicsUnit.Pixel

33、);)else如果不透明度在0到100之间,设置透明参数ImageAttributesimageAtt=GetAlphalmgAttr(opcity);将旋转后的图片画到画布上graphics.DrawImage(rotateImage,destRect,0,0,rotateRect.Width,rotateRect.Height,GraphicsUnit.Pixel,imageAtt);catch(Exceptionex)(error=ex.Message;returnretVal;finally(if(rotateImage!=null)rotateImage.Dispose();else

34、(计算水印图片的绘制位置vardestRect=GetRectangleByPostion(validRect,waterRect,pos);如果不透明度=100,那么直接将水印画到当前画布上.if(opcity=100)(graphics.DrawImage(waterImage,destRect,waterRect,GraphicsUnit.Pixel);else(如果不透明度在0到100之间,设置透明参数ImageAttributesimageAtt=GetAlphaImgAttr(opcity);将水印图片画到画布上graphics.DrawImage(waterImage,destRect,0,0,waterRect.Width,waterRect.Height,GraphicsUnit.Pixel,imageAtt);/如果两个地址相同即覆盖,则提前Dispose源资源if(destPath.ToLower()=srcPath.ToLower()(srcImage.Dispose();)SaveImage2File(destPath,destImage,quality,mimeType);retVal=true;)catch(Exceptionex)(error=ex.Mess

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论