激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - C# - C#利用GDI+畫圖的基礎(chǔ)實例教程

C#利用GDI+畫圖的基礎(chǔ)實例教程

2022-02-22 14:19Dandelion_drq C#

編寫圖形程序時需要使用GDI(Graphics Device Interface,圖形設(shè)備接口),所以通過網(wǎng)上的相關(guān)資料整理了這篇文章,下面這篇文章主要給大家介紹了關(guān)于C#利用GDI+畫圖基礎(chǔ)的相關(guān)資料,需要的朋友可以參考下。

前言

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

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

c#中的gdi+就相當(dāng)于java中的swing控件,是編寫圖形界面必不可缺的一個接口。gdi+繪圖最大的方便得益于c#的可視化編程,所有的控件只需要自己drag,然后place,最后cilck添加監(jiān)聽方法。真的是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 對象。

比如:

?
1
2
3
4
private void form1_paint(object sender, painteventargs e)
{
 graphics g = e.graphics; // 創(chuàng)建畫板,這里的畫板是由form提供的.
}

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

我一般用以下方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//
// 摘要:
//  從指定的 system.drawing.image 創(chuàng)建新的 system.drawing.graphics。
//
// 參數(shù):
// image:
//  從中創(chuàng)建新 system.drawing.graphics 的 system.drawing.image。
//
// 返回結(jié)果:
//  此方法為指定的 system.drawing.image 返回一個新的 system.drawing.graphics。
//
// 異常:
// t:system.argumentnullexception:
//  image 為 null。
//
// t:system.exception:
//  image 具有索引像素格式,或者格式未定義。
public static graphics fromimage(image image);

其中的參數(shù)可以傳入 image 或 bitmap,因為 bitmap 是繼承自 image 的。

如何創(chuàng)建畫板

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

?
1
2
image img = image.fromfile(imgpath);
graphics graphics = graphics.fromimage(img);

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

?
1
2
bitmap bmp = new bitmap(width, height);
graphics graph = graphics.fromimage(bmp);

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

如何保存畫好的圖片

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

ps: bitmap 的 save 方法是直接繼承自 image 的。

gdi+ 的坐標(biāo)系

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

C#利用GDI+畫圖的基礎(chǔ)實例教程

使用 gdi+ 的一些注意事項

這里我忍不住要先吐槽一下,gdi+ 的報錯信息不太友好啊。經(jīng)常只是返回一個“gdi+ 中發(fā)生一般性錯誤。”,不能快速地根據(jù)這個錯誤提示定位問題。比如說沒有釋放圖片資源時想再次訪問資源會報這個錯誤,想要保存圖片的文件夾不存在時也是提示這個錯誤。看不出來區(qū)別……

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

?
1
2
3
4
5
6
7
8
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 代碼段里。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 代碼段時自動釋放該資源。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/// <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)存在的,否則會報錯(gdi+中發(fā)生一般性錯誤)

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

?
1
2
3
4
5
6
7
8
string directory = @"d:\test\";
string filename = "output.png";
// 檢查文件夾是否存在,不存在則先創(chuàng)建
if (!directory.exists(directory))
{
 directory.createdirectory(directory);
}
bmp.save(directory + filename);

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對服務(wù)器之家的支持。

原文鏈接:http://www.cnblogs.com/dandelion-drq/p/use-gdiplus-to-draw-image-in-csharp.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美日韩综合视频 | 欧美在线综合视频 | 黄色网址免费入口 | 激情免费视频 | 成人免费入口 | 日本精品网 | 国产美女自拍av | 91精品国产91久久久久久丝袜 | 欧美日韩成人一区二区 | 91快色| 久久精品美乳 | 日本一区二区三区视频在线 | 韩国精品视频在线观看 | 国产午夜电影在线观看 | 成人短视频在线播放 | 欧美在线观看19 | 久久国产精品久久久久久电车 | 久久精品欧美一区二区三区不卡 | 国产精品美女久久久久久不卡 | 日韩大片在线永久观看视频网站免费 | 一边吃奶一边摸下娇喘 | 999插插插 | 国产精品999在线观看 | 国产一区二区三区在线免费 | 亚洲性生活免费视频 | 精品一区二区三区免费爱 | 久久国产精品久久久久 | 久久久免费 | 超碰97最新 | 国产成人精品一区二区视频免费 | 国产小视频一区 | 色蜜桃av| 久久影院在线观看 | 久久久久久久久成人 | 宅男噜噜噜66一区二区 | 在线成人免费观看 | 午夜色片 | 久久久www免费看片 亚洲综合视频一区 | 免费黄色欧美视频 | 久久久人成影片一区二区三区 | 亚洲自拍第一 |