成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

C#利用GDI+畫圖的示例分析-創(chuàng)新互聯(lián)

這篇文章主要為大家展示了“C#利用GDI+畫圖的示例分析”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“C#利用GDI+畫圖的示例分析”這篇文章吧。

目前創(chuàng)新互聯(lián)建站已為上千多家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬主機(jī)、成都網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計(jì)、渭濱網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

前言

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

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

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

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

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

廢話不多說,開始進(jìn)入正題。

需要用到的類

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

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

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

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

比如:

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

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

我一般用以下方法:

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

其中的參數(shù)可以傳入 Image 或 Bitmap,因?yàn)?Bitmap 是繼承自 Image 的。

如何創(chuàng)建畫板

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

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

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

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

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

如何保存畫好的圖片

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

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

GDI+ 的坐標(biāo)系

GDI+ 的坐標(biāo)系是個(gè)二維坐標(biāo)系,不過又有點(diǎn)不一樣,它的原點(diǎn)是在左上角的。如下圖:

C#利用GDI+畫圖的示例分析

使用 GDI+ 的一些注意事項(xiàng)

這里我忍不住要先吐槽一下,GDI+ 的報(bào)錯(cuò)信息不太友好啊。經(jīng)常只是返回一個(gè)“GDI+ 中發(fā)生一般性錯(cuò)誤?!?,不能快速地根據(jù)這個(gè)錯(cuò)誤提示定位問題。比如說沒有釋放圖片資源時(shí)想再次訪問資源會報(bào)這個(gè)錯(cuò)誤,想要保存圖片的文件夾不存在時(shí)也是提示這個(gè)錯(cuò)誤??床怀鰜韰^(qū)別……

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

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

2. 使用完的資源記得要釋放??梢杂?try..catch..finally 或者 using 的方式,這樣即使遇到代碼運(yùn)行報(bào)錯(cuò)也能及時(shí)釋放資源,更加保險(xiǎn)。

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 語句創(chuàng)建的資源會在離開 using 代碼段時(shí)自動釋放該資源。

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

3. 要保存圖片的文件夾一定要是已經(jīng)存在的,否則會報(bào)錯(cuò)(GDI+中發(fā)生一般性錯(cuò)誤)

eg:假設(shè)圖片要保存到 D:\test\output.png

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

以上是“C#利用GDI+畫圖的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

分享題目:C#利用GDI+畫圖的示例分析-創(chuàng)新互聯(lián)
文章地址:http://jinyejixie.com/article46/csophg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、做網(wǎng)站網(wǎng)站排名、域名注冊、搜索引擎優(yōu)化、網(wǎng)頁設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)
台安县| 务川| 札达县| 平阳县| 新蔡县| 谷城县| 临湘市| 辛集市| 维西| 济源市| 池州市| 虎林市| 城步| 凤山县| 嘉荫县| 韶关市| 永昌县| 兴化市| 长乐市| 拉孜县| 深州市| 长宁区| 东至县| 封丘县| 正阳县| 大方县| 中卫市| 阿勒泰市| 宿州市| 上蔡县| 新余市| 竹山县| 年辖:市辖区| 崇阳县| 宜兰县| 遵义市| 涟源市| 长春市| 区。| 兴业县| 灯塔市|