版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、C#中基于GDI+(Graphics)圖像處理系列之前言前言圖像處理是開(kāi)發(fā)工程師們學(xué)習(xí)某種語(yǔ)言入門時(shí)就會(huì)遇到的問(wèn)題,筆者剛開(kāi)始接觸C#使用GDI+進(jìn)行圖像處理,覺(jué)得太簡(jiǎn)單了,就沒(méi)有深入研究,隨著工作經(jīng)驗(yàn)的積累,踏遍若干坑以后突然覺(jué)得還是有必要將這塊的知識(shí)好好總結(jié)一下,畢竟還是有一些比較冷門的知識(shí)在實(shí)際應(yīng)用中給我們的程序帶來(lái)更多的靈活性,比如將圖片保存成jpeg時(shí)進(jìn)一步控制圖片的質(zhì)量、怎樣獲取任意角度旋轉(zhuǎn)后的圖像、怎樣獲取透明圖像等等。本文后面將直接放出圖像處理工具類的全部源碼和示例程序源碼,供有一定開(kāi)發(fā)能力的同學(xué)直接獲取并使用。需要深入了解代碼的同學(xué)可以根據(jù)以下章節(jié)詳細(xì)了解功能點(diǎn)的實(shí)現(xiàn),會(huì)詳細(xì)
2、說(shuō)明獲取高質(zhì)量縮略圖的要領(lǐng)、圖像旋轉(zhuǎn)的實(shí)現(xiàn)步驟等重要內(nèi)容。圖像處理工具類的全部源碼/*Copyright(C)Corporation.Allrightsreserved.*Author:lihaitao* Email:lhtzbj12* CreateDate:2016-8-15* Description:圖片處理工具,包括固定寬高、限制寬高、限制長(zhǎng)邊、文字水印圖片水印(透明、任意角度旋轉(zhuǎn))(透明)、* 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變量?jī)?yōu)化良好的圖片每個(gè)像素平均占用文件大小,經(jīng)驗(yàn)值,可根據(jù)需要修改priva
4、testaticreadonlydoublesizePerPx=0.18;#endregion#region生成高質(zhì)量縮略圖、優(yōu)化圖片/生成高質(zhì)量縮略圖(固定寬高),不一定保持原寬高比/目標(biāo)保存路徑/源文件路徑/生成縮略圖的寬度,設(shè)置為0,則與源圖比處理/生成縮略圖的高度,設(shè)置為0,則與源圖等比例處理/1100整數(shù),無(wú)效值則取默認(rèn)值95/如image/jpegpublicboolGetThumbnailImage(stringdestPath,stringsrcPath,intdestWidth,intdestHeight,intquality,outstringerror,stringmim
5、eType=image/jpeg)(boolretVal=false;error=string.Empty;寬高不能小于0if(destWidth0|destHeight0)(error=目標(biāo)寬高不能小于0;returnretVal;)寬高不能同時(shí)為0if(destWidth=0&destHeight=0)(error=目標(biāo)寬高不能同時(shí)為0;returnretVal;)ImagesrcImage=null;ImagedestImage=null;Graphicsgraphics=null;try(獲取源圖像srcImage=Image.FromFile(srcPath,false);計(jì)算高寬比
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);定義畫(huà)布destImage=newBitmap(destWidth,destHeight);獲取高清Graphicsgraphics=GetGraphics(destImage);將源圖像畫(huà)到畫(huà)布上,注意最后一個(gè)參數(shù)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();/保存到文件,同時(shí)進(jìn)一步控制質(zhì)量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;/對(duì)圖片進(jìn)行壓縮優(yōu)化(限制寬高),始終保持原寬高比Ill/目標(biāo)保存路徑Ill源文件路徑/壓縮后的圖片寬度不大于這值,如果為0,表示不限制寬度/壓縮后的圖片高度不大于這值,如果為0,表示不限制高度/1100整數(shù),無(wú)效值則取默認(rèn)值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;目的高寬比大于原高寬比即目的高偏大,因此按照原比例計(jì)算目的高度if(destDsrcD)destHeight=Convert.ToInt32(destWidth*srcD);)elseif(destDsrcD)/目的高寬比小于原高寬比即目的寬偏大,因此按照原比例計(jì)算目的寬度destWidth=Convert.ToInt32(destHeight/srcD);)/如果維持原寬高,則判斷是否需要優(yōu)化if(d
11、estWidth=srcImage.Width&destHeight=srcImage.Height&fileInfo.LengthdestWidth*destHeight*sizePerPx)error=圖片不需要壓縮優(yōu)化;returnretVal;)定義畫(huà)布destImage=newBitmap(destWidth,destHeight);獲取高清Graphicsgraphics=GetGraphics(destImage);將源圖像畫(huà)到畫(huà)布上,注意最后一個(gè)參數(shù)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();)/保存到文件,同時(shí)進(jìn)一步控制質(zhì)量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;/對(duì)圖片進(jìn)行壓縮優(yōu)化,始終保持原寬高比,限制長(zhǎng)邊長(zhǎng)度,常用場(chǎng)景:相片/目標(biāo)保存路徑/源文件路徑/壓縮后的圖片邊(寬或者高)長(zhǎng)變不大于這值,為0表示不限制/1100整數(shù),無(wú)效值,則取默認(rèn)值95/如image/jpegpublicboolGetCompressImage(stringdestPath,stringsrcPath,intmaxLength,intquality,outstringerror,string
14、mimeType=image/jpeg)(boolretVal=false;error=string.Empty;/最大邊長(zhǎng)不能小于0if(maxLength0)(原高寬比f(wàn)loatsrcD=(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);)/如果維持原寬高,則判斷是否需要優(yōu)化if(destWidth=srcImage.Width&destHeight=srcImage.Height&fileInfo.LengthdestWidth*destHeight*sizePerPx)error=圖片不需要壓縮優(yōu)化;returnretVal;)定義畫(huà)布destImage=newBitmap(destWidth,destHeight);獲取高清Graphicsgraphics=GetGraphics(destImage);將源圖像畫(huà)到畫(huà)布上,注意最后一個(gè)參數(shù)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();)/保存到文件,同時(shí)進(jìn)一步控制質(zhì)量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從圖片中挖取一塊區(qū)域/從源圖片中挖取一塊區(qū)域保存為新圖片/保存路徑/源路徑,兩個(gè)路徑可以相同,相同則會(huì)覆蓋源圖片/挖取區(qū)域左上角x值/挖取區(qū)域左上角y值/挖取區(qū)域的寬度/挖取區(qū)域的高度/1100整數(shù),無(wú)效值,則取默認(rèn)值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);定義畫(huà)布destImage=newBitmap(width,height
19、);獲取高清Graphicsgraphics=GetGraphics(destImage);將源圖像的某區(qū)域畫(huà)到新畫(huà)布上,注意最后一個(gè)參數(shù)GraphicsUnit.Pixelgraphics.DrawImage(srcImage,newRectangle(0,0,width,height),newRectangle(x,y,width,height),GraphicsUnit.Pixel);/如果是覆蓋則先釋放源資源if(destPath=srcPath)srcImage.Dispose();/保存到文件,同時(shí)進(jìn)一步控制質(zhì)量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在圖片加入文字水印或者圖片水印,并控制水印透明度,圖片水印還可以控制旋轉(zhuǎn)角度/給圖片加入文字水印,且設(shè)置水印透明度/保存地址/源文件地址,如果想覆蓋源圖片,兩個(gè)地址參數(shù)一定
21、要一樣/文字/字體,為空則使用默認(rèn),注意,在創(chuàng)建字體時(shí)GraphicsUnit.Pixel/刷子,為空則使用默認(rèn)/設(shè)置水印位置,1左上,2中上,3右上/4左中,5中,6右中/7左下,8中下,9右下/跟css里的padding個(gè)意思/1100整數(shù),無(wú)效值,則取默認(rèn)值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統(tǒng)一尺寸)if(brush=null)(brush=newSolidBrush(Color.White);)try(II獲取源圖像srcImage=Image.FromFile(srcPath,false
23、);II定義畫(huà)布,大小與源圖像一樣destImage=newBitmap(srcImage);獲取高清Graphicsgraphics=GetGraphics(destImage);將源圖像畫(huà)到畫(huà)布上,注意最后一個(gè)參數(shù)GraphicsUnit.Pixelgraphics.DrawImage(srcImage,newRectangle(0,0,destImage.Width,destImage.Height),newRectangle(0,0,srcImage.Width,srcImage.Height),GraphicsUnit.Pixel);II如果水印字不為空,且不透明度大于0,則畫(huà)水印i
24、f(!string.IsNullOrEmpty(text)&opcity0)(II獲取可以用來(lái)繪制水印圖片的有效區(qū)域RectanglevalidRect=newRectangle(padding,padding,srcImage.Width-padding*2,srcImage.Height-padding*2);II獲取繪畫(huà)水印文字的格式,即文字對(duì)齊方式StringFormatformat=GetStringFormat(pos);II如果不透明度=100,那么直接將字畫(huà)到當(dāng)前畫(huà)布上.if(opcity=100)(graphics.DrawString(text,font,brush,val
25、idRect,format);)else(如果不透明度在0到100之間,就要實(shí)現(xiàn)透明效果,文字沒(méi)法透明,圖片才能透明destImage一樣大,則先將字畫(huà)到一塊臨時(shí)畫(huà)布,臨時(shí)畫(huà)布與先將字寫(xiě)到這塊畫(huà)布上,再將臨時(shí)畫(huà)布畫(huà)到主畫(huà)布上,同時(shí)設(shè)置透明參數(shù)BitmaptransImg=null;GraphicsgForTransImg=null;try(/定義臨時(shí)畫(huà)布transImg=newBitmap(destImage);/獲取高清GraphicsgForTransImg=GetGraphics(transImg);繪制文字gForTransImg.DrawString(text,font,brush,
26、validRect,format);/*獲取帶有透明度的ImageAttributesImageAttributesimageAtt=GetAlphaImgAttr(opcity);將這塊臨時(shí)畫(huà)布畫(huà)在主畫(huà)布上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();)/如果兩個(gè)地址相同即覆蓋,則提前Dispose源資源if(destPath.ToLower()=srcPath.ToLower()(srcImage.Dispose();)/保存到文件,同時(shí)進(jìn)一步控制質(zhì)量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;/給圖片加入圖片水印,且設(shè)置水印透明度,旋轉(zhuǎn)角度/保存地址/源文件地址,如果想覆蓋源圖片,兩個(gè)地址參數(shù)一定要一樣/水印圖片地址/設(shè)置水印位置,1左上,2中上,3右上/4左中,5中,6右中/7左下,8中下,9右下/跟css里的padding個(gè)意思/1100整數(shù),無(wú)效值,則取默認(rèn)值95/不透明度100為完全不透明,0為完全透明/順時(shí)針旋轉(zhuǎn)角度/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);定義畫(huà)布destimage=newBitmap(srcimage);獲取高清Graphicsgraphics=GetGraphics(destimage);/將源圖畫(huà)到畫(huà)布上graphics.Drawimage(srcimage,newRectangle(0,0,destimage.Width,destimage.Height),
31、newRectangle(0,0,srcimage.Width,srcimage.Height),GraphicsUnit.Pixel);/不透明度大于0,則畫(huà)水印if(opcity0)(/獲取可以用來(lái)繪制水印圖片的有效區(qū)域RectanglevalidRect=newRectangle(padding,padding,srcimage.Width-padding*2,srcimage.Height-padding*2);如果要進(jìn)行旋轉(zhuǎn)if(angle!=0)(imagerotateimage=null;try(/獲取水印圖像旋轉(zhuǎn)后的圖像rotateimage=GetRotateimage(wa
32、terimage,angle);if(rotateimage!=null)(/漩轉(zhuǎn)后圖像的矩形區(qū)域varrotateRect=newRectangle(0,0,rotateimage.Width,rotateimage.Height);計(jì)算水印圖片的繪制位置vardestRect=GetRectangleByPostion(validRect,rotateRect,pos);/如果不透明度=100,那么直接將水印畫(huà)到當(dāng)前畫(huà)布上.if(opcity=100)(graphics.Drawimage(rotateimage,destRect,rotateRect,GraphicsUnit.Pixel
33、);)else如果不透明度在0到100之間,設(shè)置透明參數(shù)ImageAttributesimageAtt=GetAlphalmgAttr(opcity);將旋轉(zhuǎn)后的圖片畫(huà)到畫(huà)布上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、(計(jì)算水印圖片的繪制位置vardestRect=GetRectangleByPostion(validRect,waterRect,pos);如果不透明度=100,那么直接將水印畫(huà)到當(dāng)前畫(huà)布上.if(opcity=100)(graphics.DrawImage(waterImage,destRect,waterRect,GraphicsUnit.Pixel);else(如果不透明度在0到100之間,設(shè)置透明參數(shù)ImageAttributesimageAtt=GetAlphaImgAttr(opcity);將水印圖片畫(huà)到畫(huà)布上graphics.DrawImage(waterImage,destRect,0,0,waterRect.Width,waterRect.Height,GraphicsUnit.Pixel,imageAtt);/如果兩個(gè)地址相同即覆蓋,則提前Dispose源資源if(destPath.ToLower()=srcPath.ToLower()(srcImage.Dispose();)SaveImage2File(destPath,destImage,quality,mimeType);retVal=true;)catch(Exceptionex)(error=ex.Mess
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《食品安全信息報(bào)告》課件
- 合伙合同糾紛權(quán)威訴訟策略
- 《民用建筑構(gòu)造概述》課件
- 2025年阿里貨運(yùn)從業(yè)資格證考試一共多少題
- 2025年臨汾客貨運(yùn)從業(yè)資格證考試教材
- 2025年廣州道路運(yùn)輸從業(yè)資格證考試題和答案
- 2025年興安貨運(yùn)上崗證模擬考試0題
- 《型曲面積分的計(jì)算》課件
- 第一單元 中國(guó)開(kāi)始淪為半殖民地半封建社會(huì) 同步練習(xí) 部編版八年級(jí)歷史上冊(cè)
- 鋁單板商業(yè)步行街施工合同
- 采購(gòu)部供應(yīng)商儲(chǔ)備資源庫(kù)建立實(shí)施方案
- 青藍(lán)工程老教師指導(dǎo)幫扶青年教師活動(dòng)記錄怎么寫(xiě)范例12篇
- 閉合導(dǎo)線測(cè)量成果表(自動(dòng)計(jì)算)
- 《機(jī)電控制系統(tǒng)分析與設(shè)計(jì)》課程大作業(yè)之一――基于MATLAB
- 《瓦楞紙箱基礎(chǔ)知識(shí)》PPT課件.ppt
- 模具(塑膠件)成本估算表
- 5S的開(kāi)展進(jìn)程——現(xiàn)代企業(yè)現(xiàn)場(chǎng)的5S管理
- 分部分項(xiàng)工程劃分表模板
- XXXX年SGS供應(yīng)商質(zhì)量管理培訓(xùn)專用教材
- CAXA考試試題庫(kù)
- 中央級(jí)水利單位國(guó)有資產(chǎn)管理暫行辦法
評(píng)論
0/150
提交評(píng)論