.NET两种画图方式比较

分类:.NET
 标签:.NET,C#,绘图
   修改 | 阅读(681)| 评论(0)

.NET C#怎样画图?做项目时要做报表,没用第三方插件,只能用C#进行画图。说实在的,C#画出来的图感觉真的不怎么样,不过经过一些细节的处理后还是可以看得过去的。下面贴代码

以下示例为控制台应用程序

using System.Drawing;
using System.Data;
using System.Drawing.Drawing2D;

namespace CreatePic
{
	class Program
	{
		static void Main(string[] args)
		{
			DataTable dt=new DataTable();
			DataColumn dcv=new DataColumn("v");
			DataColumn dct=new DataColumn("t");
			dt.Columns.Add(dcv);
			dt.Columns.Add(dct);
			for(int i=0;i<34;i++)
			{
				DataRow dr = dt.NewRow();
				dr["v"] = (i*3).ToString();
				dr["t"] = "测试" + (i * 3).ToString(); 
				dt.Rows.Add(dr);
			}
			new Program().CreatePic(dt, "测试生成图片", "testCreatePic");
		}
		public string CreatePic(DataTable dt, string title, string picName)
		{
			float sum = 0;
			float max = 0;
			for (int i = 0; i < dt.Rows.Count; i++)
			{
				sum += float.Parse(dt.Rows[i]["v"].ToString());
				if (float.Parse(dt.Rows[i]["v"].ToString()) > max)
					max = float.Parse(dt.Rows[i]["v"].ToString());
			}
			max = max == 0 ? 1 : max;
			//设置字体,fonttitle为主标题的字体
			Font fontlegend = new Font("verdana", 8);
			Font fonttitle = new Font("verdana", 18, FontStyle.Bold);

			int width = 1000;
			int height = 450;
			Bitmap objbitmap = new Bitmap(width, height);
			Graphics objgraphics = Graphics.FromImage(objbitmap);
			//objgraphics.TextRenderingHint = TextRenderingHint.AntiAlias;
			objgraphics.SmoothingMode = SmoothingMode.HighQuality;
			objgraphics.CompositingQuality=CompositingQuality.HighQuality;
			//画一个白色背景
			objgraphics.FillRectangle(new SolidBrush(Color.White), 0, 0, width, height);
			System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, objbitmap.Width, objbitmap.Height), Color.Black, Color.Black, 1.2F, true);
			objgraphics.DrawString(title, fonttitle, brush, 0, 0);//标题
			int lineY = 300;
			float percentY = 0;
			for (int i = 0; i < 6; i++)
			{
				if (i == 0)
					objgraphics.DrawLine(new Pen(new SolidBrush(Color.FromArgb(0, 0, 0)), 1F), 30, lineY, 960, lineY);//横坐标
				else
					objgraphics.DrawLine(new Pen(new SolidBrush(Color.FromArgb(200, 200, 200)), 1F), 30, lineY, 960, lineY);//横坐标
				lineY -= 40;
				percentY += 20;
			}
			int lineX = 15;
			for (int i = 0; i < dt.Rows.Count; i++)
			{
				lineX += 27;
				float fillH = 200 * float.Parse(dt.Rows[i]["v"].ToString()) / max;
				fillH = fillH == 0 ? 1 : fillH;
				//******************************   效果图一(原始图)   **************************
				//objgraphics.FillRectangle(new SolidBrush(Color.FromArgb(100, 150, 255)), lineX, 300 - fillH, 25, fillH);
				//******************************   效果图二(圆角+渐变)   **********************
				PointF p1=new PointF(lineX,fillH+300);
				PointF p2 = new PointF(lineX, 300);
				LinearGradientBrush lgb = new LinearGradientBrush(p1,p2,Color.FromArgb(255,50, 100, 255),Color.FromArgb(200,100, 150, 200));
				objgraphics.FillPath(lgb,new Program().GetRoundRect(lineX,300-fillH,23,fillH,2,true));
				objgraphics.DrawPath(new Pen(Color.FromArgb(10, 100, 255)), new Program().GetRoundRect(lineX, 300 - fillH, 23, fillH, 2, true));
				//********************************************************************************
				objgraphics.DrawString(dt.Rows[i]["v"].ToString(), fontlegend, brush, lineX - 2, 280 - fillH);
				int tY = 305;
				string t = dt.Rows[i]["t"].ToString().Replace(" ", "");
				for (int j = 0; j < t.Length; j++)
				{
					objgraphics.DrawString(t.Substring(j, 1), new Font("verdana", 10), brush, lineX + 3, tY);
					tY += 15;
				}
			}
			objgraphics.DrawLine(new Pen(new SolidBrush(Color.FromArgb(0, 0, 0)), 1F), 30, lineY, 30, lineY + 240);//纵坐标

			//System.Web.HttpContext.Current.Response.ContentType = "image/Jpeg";
			//objbitmap.Save(System.Web.HttpContext.Current.Server.MapPath("TempImgs/" + picName + ".jpg"), System.Drawing.Imaging.ImageFormat.Jpeg);
			objbitmap.Save("C:\\" + picName + ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg);

			objgraphics.Dispose();
			objbitmap.Dispose();
			return "TempImgs/" + picName + ".jpg";
		}
		//画圆角矩形,返回GraphicsPath
		///
		/// 画圆角矩形,返回GraphicsPath
		///
		///X轴
		///Y轴
		///宽度
		///高度
		///圆角
		///true:只有上两角是圆角,false:全部圆角
		///GraphicsPath
		public GraphicsPath GetRoundRect(float x, float y, float width, float height, float roundRadius, bool halfRound)
		{
			GraphicsPath gp = new GraphicsPath();
			gp.AddArc(x, y, roundRadius * 2, roundRadius * 2, 180, 90);
			gp.AddLine(x + roundRadius, y, x + width - roundRadius, y);
			gp.AddArc(x + width - roundRadius * 2, y, roundRadius * 2, roundRadius * 2, 270, 90);
			if (halfRound)
			{
				gp.AddLine(x + width, y + roundRadius, x + width, y + height);
				gp.AddLine(x + width, y + height, x, y + height);
				gp.AddLine(x, y + height, x, y + roundRadius);
			}
			else
			{
				gp.AddLine(x + width, y + roundRadius, x + width, y + height - roundRadius);
				gp.AddArc(x + width - roundRadius * 2, y + height - 2 * roundRadius, roundRadius * 2, roundRadius * 2, 0, 90);
				gp.AddLine(x + roundRadius, y + height, x + width - roundRadius, y + height);
				gp.AddArc(x, y + height - 2 * roundRadius, roundRadius * 2, roundRadius * 2, 90, 90);
				gp.AddLine(x, y + roundRadius, x, y + height - roundRadius);
			}
			return gp;
		}
	}
}


以下是两张图前后的对比:


效果图一:


优化后的效果图二:


(转载请注明出处http://www.hejingzong.cn/blog/ViewBlog_9.aspx

您的昵称:*
QQ登录(无需注册直接登录可进行回复)
您的邮箱:(填写邮箱,如有回复可进行邮件通知)
验证码:
点击刷新