使用GDI+绘制高质量图和字体

对于GDI+,在正常的操作,Bitmap-- Graphcis -- DrawImage或者DrawString ,生成图片的话,会产生很多杂点,或者是图片质量不稳定..尤其是在读取图片后,生成缩略图之后,文件会被压缩而失真..

主要原因是因为没有重新设置Graphics的几个属性..

1.Graphics.SmoothingMode属性: 例如SmoothingMode.HighQuality可以产生高质量图片,但是效率低.

2.Graphics.CompositingQuality 属性: 例如:CompositingQuality.HighQuality也是产生高质量图,效率低下.

3.Graphics.InterpolationMode 属性,例如:InterpolationMode.HighQualityBicubic与前两个也是同样的效果.

这三个属性的值都是enum,具体的enum参数可以查看MSDN的说明..在这里就我不赘述..
如果是对图片进行放大,缩小,可以调整Graphics.CompositingQuality Graphics.InterpolationMode 两个属性..如果是图片生成,则可以调整Graphics.SmoothingMode属性..

另外一个问题就是关于文字生成的..按照正常的模式生成的文字,可以很明显的看到文字带有锯齿..解决的办法也是需要修改Graphics的一个属性: Graphics.TextRenderingHint...注意一点,修改TextRenderingHint的话,需要引入System.Drawing.Text,例如:Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;

 经过对这四个属性的修改,操作大部分的图片之后,产生的结果都是比较让人满意的..

在这里提供一个简单的例子..是生成印章签名的效果..提供四种字体选择..并产生一个图片..如果你的机器中没有安装指定的几种字体,你需要把字体修改一下...直接把代码拷贝..就可以看到效果...

ASPX页面:

 1 None.gif <% @ Page language = " c# "  Codebehind = " underWrite.aspx.cs "  AutoEventWireup = " false "  Inherits = " testItem.movie.underWrite "   %>
 2 None.gif <! DOCTYPE HTML PUBLIC  " -//W3C//DTD HTML 4.0 Transitional//EN "   >
 3 None.gif < HTML >
 4 None.gif     < HEAD >
 5 None.gif         < title > underWrite </ title >
 6 None.gif         < meta name = " GENERATOR "  Content = " Microsoft Visual Studio .NET 7.1 " >
 7 None.gif         < meta name = " CODE_LANGUAGE "  Content = " C# " >
 8 None.gif         < meta name = " vs_defaultClientScript "  content = " JavaScript " >
 9 None.gif         < meta name = " vs_targetSchema "  content = " http://schemas.microsoft.com/intellisense/ie5 " >
10 None.gif     </ HEAD >
11 None.gif     < body MS_POSITIONING = " GridLayout " >
12 None.gif         < form id = " Form1 "  method = " post "  runat = " server " >
13 None.gif             < asp:Image id = " Image1 "  style = " Z-INDEX: 101; LEFT: 208px; POSITION: absolute; TOP: 360px "  runat = " server " ></ asp:Image >
14 None.gif             < asp:HyperLink id = " HyperLink1 "  style = " Z-INDEX: 105; LEFT: 304px; POSITION: absolute; TOP: 312px "
15 None.gif                runat = " server "  NavigateUrl = " ../mv/index.html " > 大头帖 </ asp:HyperLink >
16 None.gif             < asp:TextBox id = " name "  style = " Z-INDEX: 104; LEFT: 208px; POSITION: absolute; TOP: 144px "  runat = " server "
17 None.gif                MaxLength = " 4 " ></ asp:TextBox >
18 None.gif             < asp:RadioButtonList id = " fontType "  style = " Z-INDEX: 103; LEFT: 208px; POSITION: absolute; TOP: 184px "
19 None.gif                runat = " server "  Width = " 240px " >
20 None.gif                 < asp:ListItem Value = " 方正黄草简体 "  Selected = " True " > 方正黄草简体 </ asp:ListItem >
21 None.gif                 < asp:ListItem Value = " 汉鼎繁淡古 " > 汉鼎繁淡古 </ asp:ListItem >
22 None.gif                 < asp:ListItem Value = " 汉鼎繁印篆 " > 汉鼎繁印篆 </ asp:ListItem >
23 None.gif                 < asp:ListItem Value = " 经典繁桟亭 " > 经典繁桟亭 </ asp:ListItem >
24 None.gif             </ asp:RadioButtonList >
25 None.gif             < asp:Button id = " bu "  style = " Z-INDEX: 102; LEFT: 208px; POSITION: absolute; TOP: 312px "  runat = " server "
26 None.gif                Text = "  刻 字  " ></ asp:Button >
27 None.gif         </ form >
28 None.gif     </ body >
29 None.gif </ HTML >
30 None.gif


CS文件:

  1 None.gif using  System;
  2 None.gif using  System.Collections;
  3 None.gif using  System.ComponentModel;
  4 None.gif using  System.Data;
  5 None.gif using  System.Drawing;
  6 None.gif using  System.Drawing.Drawing2D;
  7 None.gif using  System.IO;
  8 None.gif using  System.Web;
  9 None.gif using  System.Web.SessionState;
 10 None.gif using  System.Web.UI;
 11 None.gif using  System.Web.UI.WebControls;
 12 None.gif using  System.Web.UI.HtmlControls;
 13 None.gif
 14 None.gif namespace  testItem.movie
 15 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 16ExpandedSubBlockStart.gifContractedSubBlock.gif    /**//// <summary>
 17InBlock.gif    ///        生成印章签名
 18ExpandedSubBlockEnd.gif    /// </summary>

 19InBlock.gif    public class underWrite : System.Web.UI.Page
 20ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
 21InBlock.gif        protected System.Web.UI.WebControls.Image Image1;
 22InBlock.gif        protected System.Web.UI.WebControls.RadioButtonList fontType;
 23InBlock.gif        protected System.Web.UI.WebControls.HyperLink HyperLink1;
 24InBlock.gif        protected System.Web.UI.WebControls.Button bu;
 25InBlock.gif        protected System.Web.UI.WebControls.TextBox name;
 26InBlock.gif        
 27InBlock.gif        private void Page_Load(object sender, System.EventArgs e) 
 28ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
 29InBlock.gif            Image1.Visible = false;
 30ExpandedSubBlockEnd.gif        }

 31InBlock.gif
 32ContractedSubBlock.gifExpandedSubBlockStart.gif        Web 窗体设计器生成的代码#region Web 窗体设计器生成的代码
 33InBlock.gif        override protected void OnInit(EventArgs e)
 34ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
 35InBlock.gif            //
 36InBlock.gif            // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
 37InBlock.gif            //
 38InBlock.gif            InitializeComponent();
 39InBlock.gif            base.OnInit(e);
 40ExpandedSubBlockEnd.gif        }

 41InBlock.gif        
 42ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <summary>
 43InBlock.gif        /// 设计器支持所需的方法 - 不要使用代码编辑器修改
 44InBlock.gif        /// 此方法的内容。
 45ExpandedSubBlockEnd.gif        /// </summary>

 46InBlock.gif        private void InitializeComponent()
 47ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{    
 48InBlock.gif            this.bu.Click += new System.EventHandler(this.Button1_Click);
 49InBlock.gif            this.Load += new System.EventHandler(this.Page_Load);
 50InBlock.gif
 51ExpandedSubBlockEnd.gif        }

 52ExpandedSubBlockEnd.gif        #endregion

 53InBlock.gif
 54InBlock.gif        private void Button1_Click(object sender, System.EventArgs e)
 55ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
 56InBlock.gif            string Name = name.Text;
 57ExpandedSubBlockStart.gifContractedSubBlock.gif            if ( Name.Length < 4 ) dot.gif{
 58InBlock.gif                Response.Write( "请输入最少4个字符!" );
 59InBlock.gif                return;
 60ExpandedSubBlockEnd.gif            }

 61InBlock.gif            
 62InBlock.gif            string FontName = fontType.SelectedValue;
 63InBlock.gif            
 64InBlock.gif            int fontSize = 36;
 65InBlock.gif            int x = 10;
 66InBlock.gif            int y = 10;
 67InBlock.gif            
 68ExpandedSubBlockStart.gifContractedSubBlock.gif            switch( FontName ) dot.gif{
 69InBlock.gif                case "方正黄草简体":
 70InBlock.gif                    x = -8;
 71InBlock.gif                    y = -2;
 72InBlock.gif                    fontSize = 42;
 73InBlock.gif                    break;
 74InBlock.gif                    
 75InBlock.gif                case "汉鼎繁淡古":
 76InBlock.gif                    x = -10;
 77InBlock.gif                    y = -2;
 78InBlock.gif                    break;
 79InBlock.gif                
 80InBlock.gif                case "汉鼎繁印篆":
 81InBlock.gif                    x = -15;
 82InBlock.gif                    y = -2;
 83InBlock.gif                    break;
 84InBlock.gif                
 85InBlock.gif                case "经典繁桟亭":
 86InBlock.gif                    fontSize = 34;
 87InBlock.gif                    x = -10;
 88InBlock.gif                    y = -3;
 89InBlock.gif                    break;                    
 90ExpandedSubBlockEnd.gif            }

 91InBlock.gif            
 92InBlock.gif            Bitmap bm = new Bitmap(110,100,System.Drawing.Imaging.PixelFormat.Format32bppArgb);
 93InBlock.gif            Font font = new Font(FontName,fontSize,FontStyle.Bold);
 94InBlock.gif            
 95InBlock.gif            Graphics g = Graphics.FromImage( bm );
 96InBlock.gif            
 97InBlock.gif            g.TextRenderingHint =  System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
 98InBlock.gif            
 99ExpandedSubBlockStart.gifContractedSubBlock.gif            /**//*    这里的三个属性可以根据情况开放.
100InBlock.gif             * 
101InBlock.gif            //g.CompositingQuality = CompositingQuality.HighQuality; 
102InBlock.gif            //g.SmoothingMode = SmoothingMode.HighQuality; 
103InBlock.gif            //g.InterpolationMode = InterpolationMode.HighQualityBicubic; 
104InBlock.gif            
105ExpandedSubBlockEnd.gif            */

106InBlock.gif            g.Clear(Color.Red);        //赋予图像一个背景色
107InBlock.gif            
108InBlock.gif            g.DrawString( Name.Substring(2,1),font,new SolidBrush(Color.White),0,2 );
109InBlock.gif            g.DrawString( Name.Substring(3,1),font,new SolidBrush(Color.White),0,45-y );
110InBlock.gif            g.DrawString( Name.Substring(0,1),font,new SolidBrush(Color.White),35-x,2 );
111InBlock.gif            g.DrawString( Name.Substring(1,1),font,new SolidBrush(Color.White),35-x,45-y );
112InBlock.gif            g.Dispose();
113InBlock.gif            //设置保存路径
114InBlock.gif            bm.Save( Server.MapPath("../upload/c.jpg"),System.Drawing.Imaging.ImageFormat.Jpeg );
115InBlock.gif            bm.Dispose();
116InBlock.gif            //显示产生的图片
117InBlock.gif            Image1.ImageUrl = Server.MapPath("../upload/c.jpg") ;
118InBlock.gif            Image1.Visible = true;
119ExpandedSubBlockEnd.gif        }

120ExpandedSubBlockEnd.gif    }

121ExpandedBlockEnd.gif}

122 None.gif

效果:

GDI++_1.gif
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值