亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#利用GDI+畫圖的基礎實例教程

2019-10-29 21:05:57
字體:
來源:轉載
供稿:網友

前言

最近做一個微信公眾號服務,有一些簡單的圖片處理功能。主要就是用戶在頁面操作,前端做一些立刻顯示的效果,然后提交保存時后端真正修改原圖。

從程序設計的角度看,GDI包括兩部分:一部分是GDI對象,另一部分是GDI函數。GDI對象定義了GDI函數使用的工具和環境變量,而GDI函數使用GDI對象繪制各種圖形,在C#中,進行圖形程序編寫時用到的是GDI+(Graphics Device Interface Plus圖形設備接口)版本,GDI+是GDI的進一步擴展,它使我們編程更加方便。

C#中的GDI+就相當于java中的Swing控件,是編寫圖形界面必不可缺的一個接口。GDI+繪圖最大的方便得益于C#的可視化編程,所有的控件只需要自己Drag,然后Place,最后Cilck添加監聽方法。真的是too young too simple。

我們的后端是 ASP.NET,也就是 C# 語言了,C# 本身處理圖片還是比較方便的,使用 GDI+ 就好,只需要添加 System.Drawing 引用,不需要任何第三方庫。于是最近也用到一些比較常用的 GDI+ 圖片處理方法,就整理一下做個記錄了。

這個題目大概會寫幾篇文章,第一篇先簡單介紹一下 GDI+ 的常用對象,以及一些使用時候的注意事項,后面會挑一些項目中做過的比較有用的處理過程來介紹一下。

廢話不多說,開始進入正題。

需要用到的類

使用 GDI+ 畫圖會用到的幾個常用的類有:Graphics、Bitmap、Image。

其中 Graphics 是畫板。這個類包含了許多畫圖的方法,包括畫圖片(DrawImage),畫線(DrawLine),畫圓(DrawEllipse、FillEllipse),寫字(DrawString)等等。簡單說使用這個類可以完成我們需要的大部分工作。

生成一個 Graphics 對象需要用到 Image 或者 Bitmap。

PS: Winform 下可以直接從窗體或控件的事件中引用 Graphics 對象。

比如:

 private void Form1_Paint(object sender, PaintEventArgs e) {  Graphics g = e.Graphics; // 創建畫板,這里的畫板是由Form提供的. }

不過本文討論的是其他場景,比如 ASP.NET MVC,或單純的控制臺程序。這些時候是沒有控件的,所以要用其他方法。

我一般用以下方法:

//// 摘要://  從指定的 System.Drawing.Image 創建新的 System.Drawing.Graphics。//// 參數:// image://  從中創建新 System.Drawing.Graphics 的 System.Drawing.Image。//// 返回結果://  此方法為指定的 System.Drawing.Image 返回一個新的 System.Drawing.Graphics。//// 異常:// T:System.ArgumentNullException://  image 為 null。//// T:System.Exception://  image 具有索引像素格式,或者格式未定義。public static Graphics FromImage(Image image);

其中的參數可以傳入 Image 或 Bitmap,因為 Bitmap 是繼承自 Image 的。

如何創建畫板

如果是要對原圖進行處理,比如旋轉圖片,添加文字等,可以直接通過原圖片獲得畫板對象。

Image img = Image.FromFile(imgPath);Graphics graphics = Graphics.FromImage(img);

如果是要畫一個新的圖,可以通過要保存的圖片寬、高生成畫板。

Bitmap bmp = new Bitmap(width, height);Graphics graph = Graphics.FromImage(bmp);

PS: Graphics 本身是沒有提供構造函數來直接生成的。所以我們可以先創建一個需要保存圖片大小的 Bitmap 位圖對象,然后再獲得畫板對象。

如何保存畫好的圖片

通過調用 img.Save(savePath) 或者 bmp.Save(savePath) 即可保存對象。

PS: Bitmap 的 Save 方法是直接繼承自 Image 的。

GDI+ 的坐標系

GDI+ 的坐標系是個二維坐標系,不過又有點不一樣,它的原點是在左上角的。如下圖:

C#,gdi,畫圖程序,畫圖,c

使用 GDI+ 的一些注意事項

這里我忍不住要先吐槽一下,GDI+ 的報錯信息不太友好啊。經常只是返回一個“GDI+ 中發生一般性錯誤。”,不能快速地根據這個錯誤提示定位問題。比如說沒有釋放圖片資源時想再次訪問資源會報這個錯誤,想要保存圖片的文件夾不存在時也是提示這個錯誤??床怀鰜韰^別……

1. 保存到相同路徑的文件時要先釋放圖片資源,否則會報錯(GDI+中發生一般性錯誤)

Image img = Image.FromFile(imgPath);Bitmap bmp = new Bitmap(img);Graphics graphics = Graphics.FromImage(bmp);... // 對圖片進行一些處理img.Dispose(); // 釋放原圖資源bmp.Save(imgPath); // 保存到原圖graphics.Dispose(); // 圖片處理過程完成,剩余資源全部釋放bmp.Dispose();

2. 使用完的資源記得要釋放??梢杂?try..catch..finally 或者 using 的方式,這樣即使遇到代碼運行報錯也能及時釋放資源,更加保險。

try..catch...finally:把釋放資源的代碼寫到 finally 代碼段里。

Image img = Image.FromFile(imgPath);Bitmap bmp = new Bitmap(img);Graphics graphics = Graphics.FromImage(bmp);try{ ...}catch (System.Exception ex){ throw ex;}finally{ graphics.Dispose(); bmp.Dispose(); img.Dispose();}

using:使用 using 語句創建的資源會在離開 using 代碼段時自動釋放該資源。

/// <summary>/// 縮放圖像/// </summary>/// <param name="originalImagePath">原圖路徑</param>/// <param name="destWidth">目標圖寬度</param>/// <param name="destHeight">目標圖高度</param>/// <returns></returns>public Bitmap GetThumbnail(string originalImagePath, int destWidth, int destHeight){ using (Image imgSource = Image.FromFile(originalImagePath)) {  return GetThumbnail(imgSource, destWidth, destHeight); }}

3. 要保存圖片的文件夾一定要是已經存在的,否則會報錯(GDI+中發生一般性錯誤)

eg:假設圖片要保存到 D:/test/output.png

 string directory = @"D:/test/"; string fileName = "output.png"; // 檢查文件夾是否存在,不存在則先創建 if (!Directory.Exists(directory)) {  Directory.CreateDirectory(directory); } bmp.Save(directory + fileName);

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
性色av香蕉一区二区| 亚洲国产精品国自产拍av秋霞| 91国内精品久久| 97在线视频精品| 国产精品va在线播放我和闺蜜| 国产精品video| 国产精品久久久久久久久久ktv| 欧美日韩国产精品一区二区三区四区| 欧美国产日本高清在线| 亚洲欧美国产一区二区三区| 久久精品亚洲热| 亚洲精品小视频在线观看| 国产视频在线一区二区| 精品无码久久久久久国产| 91久久久亚洲精品| 日韩av电影手机在线观看| 国产丝袜视频一区| 8x拔播拔播x8国产精品| 668精品在线视频| 亚洲区中文字幕| 欧美日韩国产一中文字不卡| 26uuu另类亚洲欧美日本老年| 全亚洲最色的网站在线观看| 精品自拍视频在线观看| 欧美精品制服第一页| 26uuu久久噜噜噜噜| 成人激情视频免费在线| 九九久久综合网站| 成年人精品视频| 亚洲欧洲视频在线| 欧美电影在线免费观看网站| 亚洲日本aⅴ片在线观看香蕉| 米奇精品一区二区三区在线观看| 久久精品国产视频| 亚洲福利视频网| 2023亚洲男人天堂| 国产精品视频999| 国产精品丝袜一区二区三区| 成人免费网视频| 国产精品色视频| 久久精品在线视频| 亚洲网站视频福利| 91精品国产综合久久久久久久久| 国产成人免费av电影| 中文字幕亚洲一区在线观看| 亚洲va码欧洲m码| 国产精品高潮呻吟久久av无限| 亚洲一区二区三区四区视频| 精品久久在线播放| 欧美黑人极品猛少妇色xxxxx| 亚洲成年人影院在线| 91国内产香蕉| 孩xxxx性bbbb欧美| 欧美日韩国产中字| 一区二区亚洲精品国产| 国产高清视频一区三区| 亚洲欧美日韩国产中文专区| 欧美精品videosex性欧美| 亚洲天堂网站在线观看视频| 亚洲自拍偷拍区| 成人福利在线观看| 久久电影一区二区| 国产91精品不卡视频| 亚洲乱亚洲乱妇无码| 欧美中文字幕精品| 欧美大尺度激情区在线播放| 一区二区三区四区在线观看视频| 国产精品久久久久久婷婷天堂| 欧美激情精品久久久久| 国产成人涩涩涩视频在线观看| 亚洲最新av在线| 日韩精品日韩在线观看| 国产精自产拍久久久久久| www.99久久热国产日韩欧美.com| 26uuu亚洲国产精品| 国产精品入口福利| 久久99视频免费| 92看片淫黄大片欧美看国产片| 国产免费一区二区三区在线观看| 韩国国内大量揄拍精品视频| 亚洲精品一区二三区不卡| 国产精品高清在线| 日韩精品在线第一页| 中文国产成人精品| 91av在线播放| 国产成人精品一区二区在线| 亚洲综合日韩中文字幕v在线| 亚洲午夜国产成人av电影男同| 亚洲美女久久久| 国产精品mp4| 福利一区视频在线观看| 91欧美精品成人综合在线观看| 国产精品一区电影| 日韩电影在线观看免费| 欧美成aaa人片在线观看蜜臀| 国产精品久久电影观看| 欧美激情视频一区| 日本亚洲欧洲色| 热久久视久久精品18亚洲精品| 国产精品羞羞答答| 在线日韩av观看| 亚洲福利视频网站| 亚洲国产婷婷香蕉久久久久久| 国产有码在线一区二区视频| 国产精品99久久99久久久二8| 亚洲黄色在线观看| 久久精品91久久久久久再现| 8090理伦午夜在线电影| 亚洲男女自偷自拍图片另类| 国产成人精彩在线视频九色| 久99久在线视频| 亚洲欧美在线一区二区| 精品国产乱码久久久久酒店| 久久精品99久久香蕉国产色戒| 亚洲第一区中文99精品| 91精品国产综合久久香蕉最新版| 亚洲偷熟乱区亚洲香蕉av| 国产69精品99久久久久久宅男| 日韩成人网免费视频| 精品欧美激情精品一区| 日韩精品亚洲视频| 九九九久久久久久| 久久久久99精品久久久久| 中文欧美日本在线资源| 欧美在线视频导航| 久久久久久久一区二区三区| 在线电影欧美日韩一区二区私密| 亚洲欧美日本另类| 亚洲性线免费观看视频成熟| 国产激情视频一区| 国产国语刺激对白av不卡| 日韩高清中文字幕| 日韩一区二区精品视频| 欧美老少配视频| 国产v综合v亚洲欧美久久| 日本欧美在线视频| 国产丝袜一区视频在线观看| 亚洲国产婷婷香蕉久久久久久| 日本久久精品视频| 青青精品视频播放| 中文字幕国产亚洲| 91成人在线观看国产| 久久精品色欧美aⅴ一区二区| 最近2019中文字幕在线高清| 亚洲白虎美女被爆操| 久久亚洲精品中文字幕冲田杏梨| 欧美日韩国产一区二区三区| 欧洲美女7788成人免费视频| 久久久久www| 欧美午夜女人视频在线| 精品久久久久久久久久久久久久| 欧美性在线观看| 伊人一区二区三区久久精品| 欧美精品免费看| 久久久欧美一区二区| 最近2019中文字幕第三页视频| 亚洲欧美国产制服动漫| 中国日韩欧美久久久久久久久| 亚洲深夜福利在线| 97视频在线免费观看| 久久人人爽国产| y97精品国产97久久久久久| 国产精品视频中文字幕91| 日韩高清av在线|