C#使用GDI+绘制高质量图和字体
對于GDI+,在正常的操作,Bitmap-- Graphcis -- DrawImage或者DrawString?,生成圖片的話,會產(chǎn)生很多雜點,或者是圖片質(zhì)量不穩(wěn)定..尤其是在讀取圖片后,生成縮略圖之后,文件會被壓縮而失真..
主要原因是因為沒有重新設(shè)置Graphics的幾個屬性..
1.Graphics.SmoothingMode屬性: 例如SmoothingMode.HighQuality可以產(chǎn)生高質(zhì)量圖片,但是效率低.
2.Graphics.CompositingQuality 屬性: 例如:CompositingQuality.HighQuality也是產(chǎn)生高質(zhì)量圖,效率低下.
3.Graphics.InterpolationMode 屬性,例如:InterpolationMode.HighQualityBicubic與前兩個也是同樣的效果.
這三個屬性的值都是enum,具體的enum參數(shù)可以查看MSDN的說明..在這里就我不贅述..
如果是對圖片進行放大,縮小,可以調(diào)整Graphics.CompositingQuality 和Graphics.InterpolationMode 兩個屬性..如果是圖片生成,則可以調(diào)整Graphics.SmoothingMode屬性..
另外一個問題就是關(guān)于文字生成的..按照正常的模式生成的文字,可以很明顯的看到文字帶有鋸齒..解決的辦法也是需要修改Graphics的一個屬性: Graphics.TextRenderingHint...注意一點,修改TextRenderingHint的話,需要引入System.Drawing.Text,例如:Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
?經(jīng)過對這四個屬性的修改,操作大部分的圖片之后,產(chǎn)生的結(jié)果都是比較讓人滿意的..
在這里提供一個簡單的例子..是生成印章簽名的效果..提供四種字體選擇..并產(chǎn)生一個圖片..如果你的機器中沒有安裝指定的幾種字體,你需要把字體修改一下...直接把代碼拷貝..就可以看到效果...
ASPX頁面:
?
?2<!DOCTYPE?HTML?PUBLIC?"-//W3C//DTD?HTML?4.0?Transitional//EN"?>
?3<HTML>
?4????<HEAD>
?5????????<title>underWrite</title>
?6????????<meta?name="GENERATOR"?Content="Microsoft?Visual?Studio?.NET?7.1">
?7????????<meta?name="CODE_LANGUAGE"?Content="C#">
?8????????<meta?name="vs_defaultClientScript"?content="JavaScript">
?9????????<meta?name="vs_targetSchema"?content="http://schemas.microsoft.com/intellisense/ie5">
10????</HEAD>
11????<body?MS_POSITIONING="GridLayout">
12????????<form?id="Form1"?method="post"?runat="server">
13????????????<asp:Image?id="Image1"?style="Z-INDEX:?101;?LEFT:?208px;?POSITION:?absolute;?TOP:?360px"?runat="server"></asp:Image>
14????????????<asp:HyperLink?id="HyperLink1"?style="Z-INDEX:?105;?LEFT:?304px;?POSITION:?absolute;?TOP:?312px"
15????????????????runat="server"?NavigateUrl="../mv/index.html">大頭帖</asp:HyperLink>
16????????????<asp:TextBox?id="name"?style="Z-INDEX:?104;?LEFT:?208px;?POSITION:?absolute;?TOP:?144px"?runat="server"
17????????????????MaxLength="4"></asp:TextBox>
18????????????<asp:RadioButtonList?id="fontType"?style="Z-INDEX:?103;?LEFT:?208px;?POSITION:?absolute;?TOP:?184px"
19????????????????runat="server"?Width="240px">
20????????????????<asp:ListItem?Value="方正黃草簡體"?Selected="True">方正黃草簡體</asp:ListItem>
21????????????????<asp:ListItem?Value="漢鼎繁淡古">漢鼎繁淡古</asp:ListItem>
22????????????????<asp:ListItem?Value="漢鼎繁印篆">漢鼎繁印篆</asp:ListItem>
23????????????????<asp:ListItem?Value="經(jīng)典繁桟亭">經(jīng)典繁桟亭</asp:ListItem>
24????????????</asp:RadioButtonList>
25????????????<asp:Button?id="bu"?style="Z-INDEX:?102;?LEFT:?208px;?POSITION:?absolute;?TOP:?312px"?runat="server"
26????????????????Text="?刻?字?"></asp:Button>
27????????</form>
28????</body>
29</HTML>
30
CS文件:
??1using?System;
??2using?System.Collections;
??3using?System.ComponentModel;
??4using?System.Data;
??5using?System.Drawing;
??6using?System.Drawing.Drawing2D;
??7using?System.IO;
??8using?System.Web;
??9using?System.Web.SessionState;
?10using?System.Web.UI;
?11using?System.Web.UI.WebControls;
?12using?System.Web.UI.HtmlControls;
?13
?14namespace?testItem.movie
?15{
?16????/**////?<summary>
?17????///????????生成印章簽名
?18????///?</summary>
?19????public?class?underWrite?:?System.Web.UI.Page
?20????{
?21????????protected?System.Web.UI.WebControls.Image?Image1;
?22????????protected?System.Web.UI.WebControls.RadioButtonList?fontType;
?23????????protected?System.Web.UI.WebControls.HyperLink?HyperLink1;
?24????????protected?System.Web.UI.WebControls.Button?bu;
?25????????protected?System.Web.UI.WebControls.TextBox?name;
?26????????
?27????????private?void?Page_Load(object?sender,?System.EventArgs?e)?
?28????????{
?29????????????Image1.Visible?=?false;
?30????????}
?31
?32????????Web?窗體設(shè)計器生成的代碼#region?Web?窗體設(shè)計器生成的代碼
?33????????override?protected?void?OnInit(EventArgs?e)
?34????????{
?35????????????//
?36????????????//?CODEGEN:?該調(diào)用是?ASP.NET?Web?窗體設(shè)計器所必需的。
?37????????????//
?38????????????InitializeComponent();
?39????????????base.OnInit(e);
?40????????}
?41????????
?42????????/**////?<summary>
?43????????///?設(shè)計器支持所需的方法?-?不要使用代碼編輯器修改
?44????????///?此方法的內(nèi)容。
?45????????///?</summary>
?46????????private?void?InitializeComponent()
?47????????{????
?48????????????this.bu.Click?+=?new?System.EventHandler(this.Button1_Click);
?49????????????this.Load?+=?new?System.EventHandler(this.Page_Load);
?50
?51????????}
?52????????#endregion
?53
?54????????private?void?Button1_Click(object?sender,?System.EventArgs?e)
?55????????{
?56????????????string?Name?=?name.Text;
?57????????????if?(?Name.Length?<?4?)?{
?58????????????????Response.Write(?"請輸入最少4個字符!"?);
?59????????????????return;
?60????????????}
?61????????????
?62????????????string?FontName?=?fontType.SelectedValue;
?63????????????
?64????????????int?fontSize?=?36;
?65????????????int?x?=?10;
?66????????????int?y?=?10;
?67????????????
?68????????????switch(?FontName?)?{
?69????????????????case?"方正黃草簡體":
?70????????????????????x?=?-8;
?71????????????????????y?=?-2;
?72????????????????????fontSize?=?42;
?73????????????????????break;
?74????????????????????
?75????????????????case?"漢鼎繁淡古":
?76????????????????????x?=?-10;
?77????????????????????y?=?-2;
?78????????????????????break;
?79????????????????
?80????????????????case?"漢鼎繁印篆":
?81????????????????????x?=?-15;
?82????????????????????y?=?-2;
?83????????????????????break;
?84????????????????
?85????????????????case?"經(jīng)典繁桟亭":
?86????????????????????fontSize?=?34;
?87????????????????????x?=?-10;
?88????????????????????y?=?-3;
?89????????????????????break;????????????????????
?90????????????}
?91????????????
?92????????????Bitmap?bm?=?new?Bitmap(110,100,System.Drawing.Imaging.PixelFormat.Format32bppArgb);
?93????????????Font?font?=?new?Font(FontName,fontSize,FontStyle.Bold);
?94????????????
?95????????????Graphics?g?=?Graphics.FromImage(?bm?);
?96????????????
?97????????????g.TextRenderingHint?=??System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
?98????????????
?99????????????/**//*????這里的三個屬性可以根據(jù)情況開放.
100?????????????*?
101????????????//g.CompositingQuality?=?CompositingQuality.HighQuality;?
102????????????//g.SmoothingMode?=?SmoothingMode.HighQuality;?
103????????????//g.InterpolationMode?=?InterpolationMode.HighQualityBicubic;?
104????????????
105????????????*/
106????????????g.Clear(Color.Red);????????//賦予圖像一個背景色
107????????????
108????????????g.DrawString(?Name.Substring(2,1),font,new?SolidBrush(Color.White),0,2?);
109????????????g.DrawString(?Name.Substring(3,1),font,new?SolidBrush(Color.White),0,45-y?);
110????????????g.DrawString(?Name.Substring(0,1),font,new?SolidBrush(Color.White),35-x,2?);
111????????????g.DrawString(?Name.Substring(1,1),font,new?SolidBrush(Color.White),35-x,45-y?);
112????????????g.Dispose();
113????????????//設(shè)置保存路徑
114????????????bm.Save(?Server.MapPath("../upload/c.jpg"),System.Drawing.Imaging.ImageFormat.Jpeg?);
115????????????bm.Dispose();
116????????????//顯示產(chǎn)生的圖片
117????????????Image1.ImageUrl?=?Server.MapPath("../upload/c.jpg")?;
118????????????Image1.Visible?=?true;
119????????}
120????}
121}
122
總結(jié)
以上是生活随笔為你收集整理的C#使用GDI+绘制高质量图和字体的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2014兄弟连cocos2d-x3.0视
- 下一篇: 游戏SDK应用内悬浮窗的实现(四)