用ASP.NET with C# 绘制曲线图(Curve图)

来源:互联网 发布:sai软件无毒下载 编辑:程序博客网 时间:2024/06/04 19:13


文件描述#region 文件描述
// -------------------------------------------------------------------------------------------------
// 描述:绘画曲线图
// 作者:郭锋
// 日期:2007年3月 日
// -------------------------------------------------------------------------------------------------
#endregion

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

namespace ColorFul.Infor.wwwroot.Class
{
    
public class Curve
    
{
        
private // 私有成员数据区#region private // 私有成员数据区
        
// ---------------------------------------------------------------------------------------------
        /**//// <summary>
        
/// X轴长度
        
/// </summary>

        private int _xWidth;            // X轴长度

        
/**//// <summary>
        
/// Y轴长度
        
/// </summary>

        private int _yHeight;           // Y轴长度

        
/**//// <summary>
        
/// X轴大刻度间隔长度
        
/// </summary>

        private int _xBigSpace;         // X轴大刻度间隔长度

        
/**//// <summary>
        
/// X轴小刻度间隔长度
        
/// </summary>

        private int _xSmallSpace;       // X轴小刻度间隔长度
        /**//// <summary>
        
/// Y轴刻度间隔长度
        
/// </summary>

        private int _ySpace;            // Y轴刻度间隔长度
        
        
/**//// <summary>
        
/// 曲线值间隔
        
/// </summary>

        private decimal _ySpaceValue;       // 曲线值间隔
        
        
/**//// <summary>
        
/// 原点X轴坐标
        
/// </summary>

        private int Origin_x;           // 原点X轴坐标
        /**//// <summary>
        
/// 原点Y轴坐标
        
/// </summary>

        private int Origin_y;           // 原点Y轴坐标
        
        
/**//// <summary>
        
/// X轴大刻度数目
        
/// </summary>

        private int _xMaxScaleCount;    // X轴大刻度数目

        
/**//// <summary>
        
/// Y轴输入的最大值
        
/// </summary>

        private float _yMaxValue;          // Y轴输入的最大值

        
/**//// <summary>
        
/// Y轴输入的最小值
        
/// </summary>

        private float _yMinValue;          //Y轴输入的最小值

        
/**//// <summary>
        
/// Y轴刻度值预留长度
        
/// </summary>

        private int _yTextLength = 10;      //Y轴刻度值预留长度

        
/**//// <summary>
        
/// X轴刻度值预留高度
        
/// </summary>

        private int _xTextHeight = 10;      //X轴刻度值预留高度

        
/**//// <summary>
        
/// 标题行高
        
/// </summary>

        private int TitleHeight = 0;        //标题行高
        
// ---------------------------------------------------------------------------------------------
        #endregion


        
public //公共属性区域#region public //公共属性区域
        
// -----------------------------------------------------------------------------------------
        public string ImgTitle  // 图片标题#region public string ImgTitle  // 图片标题
        
// -----------------------------------------------------------------------------------------
        /**//// <summary>
        
/// 图片标题
        
/// </summary>

        private string _imgTitle;          // 图片标题
        /**//// <summary>
        
/// 图片标题
        
/// </summary>

        public string ImgTitle
        
{
            
set { _imgTitle = value; }
        }

        
// -----------------------------------------------------------------------------------------
        #endregion


        
public float[] Values //曲线数值#region public float[] Values //曲线数值
        
// -----------------------------------------------------------------------------------------
        /**//// <summary>
        
/// 曲线数值
        
/// </summary>

        private float[] _values;            // 曲线数值
        /**//// <summary>
        
/// 曲线数值
        
/// </summary>

        public float[] DataValues
        
{
            
set { _values = value; }
        }

        
// -----------------------------------------------------------------------------------------
        #endregion


        
public int XMinScaleCount    //X轴的最大范围#region public int XMinScaleCount    //X轴的最大范围
        
// -----------------------------------------------------------------------------------------
        /**//// <summary>
        
/// X轴小刻度数目;
        
/// </summary>

        private int _xMinScaleCount = 0;    // X轴小刻度数目;
        /**//// <summary>
        
/// X轴的最大范围
        
/// </summary>

        public int XMinScaleCount
        
{
            
set { _xMinScaleCount = value; }
        }
 
        
// -----------------------------------------------------------------------------------------
        #endregion


        
public string XTitle    // X轴坐标标题#region public string XTitle    // X轴坐标标题
        
// -----------------------------------------------------------------------------------------
        /**//// <summary>
        
/// X轴文字
        
/// </summary>

        private string _xTitle="X轴标题";            // X轴文字
        /**//// <summary>
        
/// X轴坐标标题
        
/// </summary>

        public string XTitle
        
{
            
get return _xTitle; }
            
set { _xTitle = value; }
        }

        
// -----------------------------------------------------------------------------------------
        #endregion


        
public string YTitle    // Y轴坐标标题#region public string YTitle    // Y轴坐标标题
        
// -----------------------------------------------------------------------------------------
        /**//// <summary>
        
/// Y轴文字
        
/// </summary>

        private string _yTitle="Y轴标题";            // Y轴文字
        /**//// <summary>
        
/// Y轴坐标标题
        
/// </summary>

        public string YTitle
        
{
            
get return _yTitle; }
            
set { _yTitle = value; }
        }

        
// -----------------------------------------------------------------------------------------
        #endregion


        
public int ImgWidth //图片宽度#region public int ImgWidth //图片宽度
        
// -----------------------------------------------------------------------------------------
        /**//// <summary>
        
/// 图片宽度
        
/// </summary>

        private int _imgWidth = 500;          // 图片宽度
        /**//// <summary>
        
/// 图片宽度
        
/// </summary>

        public int ImgWidth
        
{
            
get return _imgWidth; }
            
set { _imgWidth = value; }

        }

        
// -----------------------------------------------------------------------------------------
        #endregion


        
public int ImgHeight    //图片高度#region public int ImgHeight    //图片高度
        
// -----------------------------------------------------------------------------------------
        /**//// <summary>
        
/// 图片高度
        
/// </summary>

        private int _imgHeight = 500;         // 图片高度
        /**//// <summary>
        
/// 图片高度
        
/// </summary>

        public int ImgHeight
        
{
            
get return _imgHeight; }
            
set { _imgHeight = value; }
        }

        
// -----------------------------------------------------------------------------------------
        #endregion


        
public Color ImgBgColor //图片背景颜色,默认白色#region public Color ImgBgColor //图片背景颜色,默认白色
        
// -----------------------------------------------------------------------------------------
        /**//// <summary>
        
/// 图片背景颜色,默认白色
        
/// </summary>

        private Color _imgBgColor = Color.White;        // 图片背景颜色,默认白色
        /**//// <summary>
        
/// 图片背景颜色,默认白色
        
/// </summary>

        public Color ImgBgColor
        
{
            
set { _imgBgColor = value; }
        }

        
// -----------------------------------------------------------------------------------------
        #endregion


        
public Color ImgBorderColor //图片背景边框颜色,默认黑色#region public Color ImgBorderColor //图片背景边框颜色,默认黑色
        
// -----------------------------------------------------------------------------------------
        /**//// <summary>
        
/// 图片背景边框颜色,默认黑色
        
/// </summary>

        private Color _imgBorderColor = Color.Black;    // 图片背景边框颜色,默认黑色
        /**//// <summary>
        
/// 图片背景边框颜色,默认黑色
        
/// </summary>

        public Color ImgBorderColor
        
{
            
set { _imgBorderColor = value; }
        }

        
// -----------------------------------------------------------------------------------------
        #endregion


        
public Color AxisColor  //刻度线颜色,默认黑色#region public Color AxisColor  //刻度线颜色,默认黑色
        
// -----------------------------------------------------------------------------------------
        /**//// <summary>
        
/// 刻度线颜色,默认黑色
        
/// </summary>

        private Color _axisColor = Color.Black;         // 刻度线颜色
        /**//// <summary>
        
/// 刻度线颜色,默认黑色
        
/// </summary>

        public Color AxisColor
        
{
            
set { _axisColor = value; }
        }

        
// -----------------------------------------------------------------------------------------
        #endregion


        
public Color SliceTextColor //刻度文字颜色,默认黑色#region public Color SliceTextColor //刻度文字颜色,默认黑色
        
// -----------------------------------------------------------------------------------------
        /**//// <summary>
        
/// 刻度文字颜色,默认黑色
        
/// </summary>

        private Color _sliceTextColor = Color.Black;    // 刻度文字颜色,默认黑色
        /**//// <summary>
        
/// 刻度文字颜色,默认黑色
        
/// </summary>

        public Color SliceTextColor
        
{
            
set { _sliceTextColor = value; }
        }

        
// -----------------------------------------------------------------------------------------
        #endregion


        
public Color AxisTextColor  //绘制轴标题的颜色,默认黑色#region public Color AxisTextColor  //绘制轴标题的颜色,默认黑色
        
// -----------------------------------------------------------------------------------------
        /**//// <summary>
        
/// 绘制轴标题的颜色,默认黑色
        
/// </summary>

        private Color _axisTextColor = Color.Black;     // 绘制轴标题的颜色,默认黑色
        /**//// <summary>
        
/// 绘制轴标题的颜色,默认黑色
        
/// </summary>

        public Color AxisTextColor
        
{
            
set { _axisTextColor = value; }
        }

        
// -----------------------------------------------------------------------------------------
        #endregion


        
public int PaddingWidth //内容边界宽度,默认值=ImgWidth*0.05#region public int PaddingWidth //内容边界宽度,默认值=ImgWidth*0.05
        
// -----------------------------------------------------------------------------------------
        private int paddingwidth = 0;
        
/**//// <summary>
        
/// 内容边界宽度,默认值=ImgWidth*0.05
        
/// </summary>

        public int PaddingWidth
        
{
            
get return paddingwidth; }
            
set { paddingwidth = value; }
        }

        
// -----------------------------------------------------------------------------------------
        #endregion


        
public int PaddingHeight //内容边界高度,默认值=ImgHeight*0.05#region public int PaddingHeight //内容边界高度,默认值=ImgHeight*0.05
        
// -----------------------------------------------------------------------------------------
        private int paddingheight = 0;
        
/**//// <summary>
        
/// 内容边界高度,默认值=ImgWidth*0.05
        
/// </summary>

        public int PaddingHeight
        
{
            
get return paddingheight; }
            
set { paddingheight = value; }
        }

        
// -----------------------------------------------------------------------------------------
        #endregion


        
public int XScaleMultiple    //大小刻度的倍数#region public int XScaleMultiple    //大小刻度的倍数
        
// -----------------------------------------------------------------------------------------
        private int Xscalemultiple = 3;
        
/**//// <summary>
        
/// 大小刻度的倍数,即几个小刻度一个大刻度,默认为3
        
/// </summary>

        public int XScaleMultiple
        
{
            
get return Xscalemultiple; }
            
set { Xscalemultiple = value; }
        }

        
// -----------------------------------------------------------------------------------------
        #endregion


        
public int XBegin  //X轴开始坐标#region public int XBegin  //X轴开始坐标
        
// -----------------------------------------------------------------------------------------
        /**//// <summary>
        
/// X轴开始位置
        
/// </summary>

        private int _beginX = 0;            // X轴开始位置
        /**//// <summary>
        
/// X轴开始坐标
        
/// </summary>

        public int XBegin
        
{
            
get return _beginX; }
            
set { _beginX = value; }
        }

        
// -----------------------------------------------------------------------------------------
        #endregion


        
public int YBegin   //Y轴开始坐标#region public int YBegin   //Y轴开始坐标
        
// -----------------------------------------------------------------------------------------
        /**//// <summary>
        
/// Y轴开始位置
        
/// </summary>

        private int _beginY = 0;            // Y轴开始位置
        /**//// <summary>
        
/// Y轴开始坐标
        
/// </summary>

        public int YBegin
        
{
            
get return _beginY; }
            
set { _beginY = value; }
        }

        
// -----------------------------------------------------------------------------------------
        #endregion
]

        
public int YScaleCount  //Y轴刻度份数,将Y轴评分成几分,默认为10#region public int YScaleCount  //Y轴刻度份数,将Y轴评分成几分,默认为10
        
// -----------------------------------------------------------------------------------------
        /**//// <summary>
        
/// Y轴刻度份数,将Y轴评分成几分,默认为10
        
/// </summary>

        private int Yscalecount = 10;
        
/**//// <summary>
        
/// Y轴刻度份数,将Y轴评分成几分,默认为10
        
/// </summary>

        public int YScaleCount
        
{
            
get return Yscalecount; }
            
set { Yscalecount = value; }
        }

        
// -----------------------------------------------------------------------------------------
        #endregion


        
public int YScaleBaseValue  //Y轴刻度间隔数值#region public int YScaleBaseValue  //Y轴刻度间隔数值
        
// -----------------------------------------------------------------------------------------
        /**//// <summary>
        
/// Y轴刻度间隔数值
        
/// </summary>

        private int _yScaleBaseValue;   //Y轴刻度间隔数值
        /**//// <summary>
        
/// Y轴刻度间隔数值
        
/// </summary>

        public int YScaleBaseValue
        
{
            
set { _yScaleBaseValue = value; }
        }

        
// -----------------------------------------------------------------------------------------
        #endregion


        
public string[] XScaleValue //X轴刻度值#region public string[] XScaleValue //X轴刻度值
        
// -----------------------------------------------------------------------------------------
        private string[] _xScalueValue;
        
/**//// <summary>
        
/// X轴刻度值
        
/// </summary>

        public string[] XScaleValue
        
{
            
get return _xScalueValue; }
            
set { _xScalueValue = value; }
        }

        
// -----------------------------------------------------------------------------------------
        #endregion


        
public Font TitleFont   //标题字体设置#region public Font TitleFont   //标题字体设置
        
// -----------------------------------------------------------------------------------------
        private Font titlefont = new Font("宋体"15, FontStyle.Regular, GraphicsUnit.Pixel);
        
/**//// <summary>
        
/// 标题字体设置
        
/// </summary>

        public Font TitleFont
        
{
            
set { titlefont = value; }
        }

        
// -----------------------------------------------------------------------------------------
        #endregion


        
public Color ImgTitleColor  //图片标题文字颜色,默认红色#region public Color ImgTitleColor  //图片标题文字颜色,默认红色
        
// -----------------------------------------------------------------------------------------
        /**//// <summary>
        
/// 图片标题文字颜色,默认红色
        
/// </summary>

        private Color _imgTitleColor = Color.Red;     // 图片标题文字颜色,默认红色
        /**//// <summary>
        
/// 图片标题文字颜色,默认红色
        
/// </summary>

        public Color ImgTitleColor
        
{
            
set { _imgTitleColor = value; }
        }

        
// -----------------------------------------------------------------------------------------
        #endregion


        
public Font Font    //绘制文字的字体,默认宋体12px#region public Font Font    //绘制文字的字体,默认宋体12px
        
// -----------------------------------------------------------------------------------------
        /**//// <summary>
        
/// 绘制文字的字体,默认宋体12px
        
/// </summary>

        private Font _font = new Font("宋体"12, FontStyle.Regular, GraphicsUnit.Pixel);              // 绘制文字的字体
        /**//// <summary>
        
/// 绘制文字的字体,默认宋体12px
        
/// </summary>

        public Font Font
        
{
            
set { _font = value; }
        }

        
// -----------------------------------------------------------------------------------------
        #endregion


        
public float Tension    //曲线的圆滑度#region public float Tension    //曲线的圆滑度
        
// -----------------------------------------------------------------------------------------
        /**//// <summary>
        
/// 曲线的圆滑度,默认 0.45f;
        
/// </summary>

        private float _tension = 0.45f;          // 曲线的圆滑度默认 0.45f;
        /**//// <summary>
        
/// 曲线的圆滑度,默认 0.45f;
        
/// </summary>

        public float Tension
        
{
            
set { _tension = value; }
        }

        
// -----------------------------------------------------------------------------------------
        #endregion


        
public Color CurverColor       // 曲线颜色,默认黑色#region public Color CurverColor       // 曲线颜色,默认黑色
        
// -----------------------------------------------------------------------------------------
        /**//// <summary>
        
/// 曲线颜色,默认黑色
        
/// </summary>

        private Color _curveColor = Color.Black;        // 曲线颜色,默认黑色
        /**//// <summary>
        
/// 曲线颜色,默认黑色
        
/// </summary>

        public Color CurverColor
        
{
            
set { _curveColor = value; }
        }

        
// -----------------------------------------------------------------------------------------
        #endregion


        
public float YScaleMaxValue  //Y轴刻度最大值#region public float YScaleMaxValue  //Y轴刻度最大值
        
// -----------------------------------------------------------------------------------------
        /**//// <summary>
        
/// Y轴刻度最大值
        
/// </summary>

        private int _yScaleMaxValue = 0;
        
/**//// <summary>
        
/// Y轴刻度最大值
        
/// </summary>

        public int YScaleMaxValue
        
{
            
set { _yScaleMaxValue = value; }
        }

        
// -----------------------------------------------------------------------------------------
        #endregion


        
public float YScaleMinValue  //Y轴刻度最小值#region public float YScaleMinValue  //Y轴刻度最小值
        
// -----------------------------------------------------------------------------------------
        /**//// <summary>
        
/// Y轴刻度最小值
        
/// </summary>

        private int _yScaleMinValue = 0;
        
/**//// <summary>
        
/// Y轴刻度最小值
        
/// </summary>

        public int YScaleMinValue
        
{
            
set { _yScaleMinValue = value; }
        }

        
// -----------------------------------------------------------------------------------------
        #endregion
 
        
// -----------------------------------------------------------------------------------------
        #endregion


        
private void InitValue() // 初始化所有数据数值#region private void InitValue() // 初始化所有数据数值
        
// ---------------------------------------------------------------------------------------------
        /**//// <summary>
        
/// 初始化所有数据数值
        
/// </summary>

        private void InitValue()
        
{
            
//_values = new float[30];
            
//Random random = new Random();
            
//for (int i = 0; i < 30; i++)
            
//{
            
//    _values[i] = Convert.ToSingle(random.Next(0, 1000));
            
//}
            
            
//{ 0, 120, 300, 90, 100, 134, 130, 160, 0, 70, 100, 120, 130, 120, 90, 12, 66, 78, 300, 400, 89, 65, 34, 23, 34, 25, 67, 23, 45, 78, 120 };

            
//取得最大与最小值
            _yMaxValue = 1f;
            _yMinValue 
= 0f;
            
for (int i = 0; i < _values.Length; i++)
            
{
                _yMaxValue 
= Math.Max(_yMaxValue, _values[i]);
                _yMinValue 
= Math.Min(_yMinValue, _values[i]);
            }

            
//取得刻度文字的预留长度和高度
            _yTextLength = TextImgSize.GetSize(_yMaxValue.ToString(), _font).Width;
            _xTextHeight 
= TextImgSize.GetSize(_yMaxValue.ToString(), _font).Height;
            GetTopAndEnd(_yMaxValue, _yMinValue, 
out _yScaleMaxValue, out _yScaleMinValue);

            
//取得标题行高
            TitleHeight = TextImgSize.GetSize(_imgTitle, titlefont).Height;
            
//设置作图区域边界
            paddingwidth = paddingwidth == 0 ? Convert.ToInt32(_imgWidth * 0.05) : paddingwidth;
            paddingheight 
= paddingheight == 0 ? Convert.ToInt32(_imgHeight * 0.05) : paddingheight;

            
//设置X轴小刻度数目
            
//_xMinScaleCount = _values.Length;
            
//设置X轴大刻度数目
            _xMaxScaleCount = _xScalueValue.Length-1;
            
//X轴宽度=图片宽度-边界宽*2-上下文字与刻度预留宽度
            _xWidth = _imgWidth - paddingwidth * 2 - _yTextLength;
            
//小刻度宽度
            _xSmallSpace = _xWidth / _xMinScaleCount;
            
//大刻度宽度=小刻度宽度*倍数
            _xBigSpace = _xWidth/_xMaxScaleCount;

            
            _yScaleBaseValue 
= (_yScaleMaxValue - _yScaleMinValue) / Yscalecount;

            
            
//Y轴高度=图片高度-边界高度*2-Y轴下方刻度文字行高-标题高度
            _yHeight = _imgHeight - paddingheight * 2 - _xTextHeight - TitleHeight;
            _ySpace 
= _yHeight / Yscalecount;

            
if (_yMaxValue >= Yscalecount)
            
{
                _ySpaceValue 
= Convert.ToDecimal(_yMaxValue / Yscalecount);
            }

            
else
            
{
                _ySpaceValue 
= Math.Round((decimal)_yMaxValue / (decimal)101);
            }


            Origin_x 
=  _yTextLength+paddingwidth;
            Origin_y 
= _imgHeight - _xTextHeight - paddingheight;
        }

        
// ---------------------------------------------------------------------------------------------
        #endregion


        
public byte[] DrawCurveGraph() // 绘制曲线图#region public byte[] DrawCurveGraph() // 绘制曲线图
        
// ---------------------------------------------------------------------------------------------
        /**//// <summary>
        
/// 绘制整个曲线图
        
/// </summary>

        public byte[] DrawCurveGraph()
        
{
            InitValue();

            Bitmap objBitmap 
= new Bitmap(_imgWidth, _imgHeight, PixelFormat.Format16bppRgb565);
            Graphics objGraphics 
= Graphics.FromImage(objBitmap);
            Pen axisPen 
= new Pen(new SolidBrush(_axisColor), 1);
            
float FirstPoint_X = 0f;
            
float FirstPoint_Y = 0f;
            
float SecondPoint_X = 0f;
            
float SecondPoint_Y = 0f;

            
// 绘制背景及边框
            
//objGraphics.DrawRectangle(new Pen(_imgBorderColor, 1), 0, 0, _imgWidth, _imgHeight);
            objGraphics.FillRectangle(new SolidBrush(_imgBgColor), 00, _imgWidth, _imgHeight);

            
//画Y轴直线
            FirstPoint_X = Convert.ToSingle(Origin_x);
            FirstPoint_Y 
= Convert.ToSingle(paddingheight + TitleHeight - 5);
            
//FirstPoint_Y = Convert.ToSingle(_imgHeight-paddingheight);
            SecondPoint_X = Convert.ToSingle(Origin_x);
            SecondPoint_Y 
= Convert.ToSingle(Origin_y);
            objGraphics.DrawLine(axisPen, FirstPoint_X, FirstPoint_Y, SecondPoint_X, SecondPoint_Y);
            
//画箭头左半边
            FirstPoint_X = Convert.ToSingle(Origin_x - 5);
            FirstPoint_Y 
= Convert.ToSingle(paddingheight + 5 + TitleHeight - 5);
            SecondPoint_X 
= Convert.ToSingle(Origin_x);
            SecondPoint_Y 
= Convert.ToSingle(paddingheight + TitleHeight - 5);
            objGraphics.DrawLine(axisPen, FirstPoint_X, FirstPoint_Y, SecondPoint_X, SecondPoint_Y);
            
//画箭头右半边
            FirstPoint_X = Convert.ToSingle(Origin_x);
            FirstPoint_Y 
= Convert.ToSingle(paddingheight + TitleHeight - 5);
            SecondPoint_X 
= Convert.ToSingle(Origin_x + 5);
            SecondPoint_Y 
= Convert.ToSingle(paddingheight + 5 + TitleHeight - 5);
            objGraphics.DrawLine(axisPen, FirstPoint_X, FirstPoint_Y, SecondPoint_X, SecondPoint_Y);

            
//画X轴直线
            FirstPoint_X = Convert.ToSingle(Origin_x);
            FirstPoint_Y 
= Convert.ToSingle(Origin_y);
            SecondPoint_X 
= Convert.ToSingle(Origin_x + _xWidth);
            SecondPoint_Y 
= Convert.ToSingle(Origin_y);
            objGraphics.DrawLine(axisPen, FirstPoint_X, FirstPoint_Y, SecondPoint_X, SecondPoint_Y);
            
//画箭头上半边
            FirstPoint_X = Convert.ToSingle(Origin_x + _xWidth - 5);
            FirstPoint_Y 
= Convert.ToSingle(Origin_y - 5);
            SecondPoint_X 
= Convert.ToSingle(Origin_x + _xWidth);
            SecondPoint_Y 
= Convert.ToSingle(Origin_y);
            objGraphics.DrawLine(axisPen, FirstPoint_X, FirstPoint_Y, SecondPoint_X, SecondPoint_Y);
            
//画箭头下半边
            FirstPoint_X = Convert.ToSingle(Origin_x + _xWidth - 5);
            FirstPoint_Y 
= Convert.ToSingle(Origin_y + 5);
            SecondPoint_X 
= Convert.ToSingle(Origin_x + _xWidth);
            SecondPoint_Y 
= Convert.ToSingle(Origin_y);
            objGraphics.DrawLine(axisPen, FirstPoint_X, FirstPoint_Y, SecondPoint_X, SecondPoint_Y);

            
// 绘制Y轴上的刻度和文字
            DrawYAxis(objGraphics);

            
// 绘制X轴上的刻度和文字
            DrawXAxis(objGraphics);

            
// 绘制标题
            DrawTitle(objGraphics);

            
// 绘制数据曲线
            DrawCurve(objGraphics);

            
/**/////擦除Y轴画超出的部分

            
//objGraphics.FillRectangle(new SolidBrush(_imgBgColor), _beginX, _beginY, _imgWidth - _beginX - 2, _imgHeight - _beginY - 2);

            
// 绘制XY轴向说明文字
            DrawAxisText(objGraphics);

            MemoryStream ms 
= new MemoryStream();
            objBitmap.Save(ms, ImageFormat.Jpeg);
            
return ms.ToArray();
        }

        
// ---------------------------------------------------------------------------------------------
        #endregion


        
public void DrawCurveGraphPutOut(System.Web.HttpResponse response)  //画图并直接输出到制定页面#region public void DrawCurveGraphPutOut(System.Web.HttpResponse response)  //画图并直接输出到制定页面
        
// -----------------------------------------------------------------------------------------
        /**//// <summary>
        
/// 画图并直接输出到制定页面
        
/// </summary>
        
/// <param name="response">指定页面的输出流</param>

        public void DrawCurveGraphPutOut(System.Web.HttpResponse response)
        
{
            InitValue();

            Bitmap objBitmap 
= new Bitmap(_imgWidth, _imgHeight, PixelFormat.Format16bppRgb565);
            Graphics objGraphics 
= Graphics.FromImage(objBitmap);
            Pen axisPen 
= new Pen(new SolidBrush(_axisColor), 1);
            
float FirstPoint_X = 0f;
            
float FirstPoint_Y = 0f;
            
float SecondPoint_X = 0f;
            
float SecondPoint_Y = 0f;

            
// 绘制背景及边框
            
//objGraphics.DrawRectangle(new Pen(_imgBorderColor, 1), 0, 0, _imgWidth, _imgHeight);
            objGraphics.FillRectangle(new SolidBrush(_imgBgColor), 00, _imgWidth , _imgHeight );

            
//画Y轴直线
            FirstPoint_X = Convert.ToSingle(Origin_x);
            FirstPoint_Y 
= Convert.ToSingle(paddingheight + TitleHeight - 5);
            
//FirstPoint_Y = Convert.ToSingle(_imgHeight-paddingheight);
            SecondPoint_X = Convert.ToSingle(Origin_x);
            SecondPoint_Y 
= Convert.ToSingle(Origin_y);
            objGraphics.DrawLine(axisPen, FirstPoint_X, FirstPoint_Y, SecondPoint_X, SecondPoint_Y);
            
//画箭头左半边
            FirstPoint_X = Convert.ToSingle(Origin_x - 5);
            FirstPoint_Y 
= Convert.ToSingle(paddingheight + 5 + TitleHeight - 5);
            SecondPoint_X 
= Convert.ToSingle(Origin_x);
            SecondPoint_Y 
= Convert.ToSingle(paddingheight + TitleHeight - 5);
            objGraphics.DrawLine(axisPen, FirstPoint_X, FirstPoint_Y, SecondPoint_X, SecondPoint_Y);
            
//画箭头右半边
            FirstPoint_X = Convert.ToSingle(Origin_x);
            FirstPoint_Y 
= Convert.ToSingle(paddingheight + TitleHeight - 5);
            SecondPoint_X 
= Convert.ToSingle(Origin_x + 5);
            SecondPoint_Y 
= Convert.ToSingle(paddingheight + 5 + TitleHeight - 5);
            objGraphics.DrawLine(axisPen, FirstPoint_X, FirstPoint_Y, SecondPoint_X, SecondPoint_Y);

            
//画X轴直线
            FirstPoint_X = Convert.ToSingle(Origin_x);
            FirstPoint_Y 
= Convert.ToSingle(Origin_y);
            SecondPoint_X 
= Convert.ToSingle(Origin_x + _xWidth);
            SecondPoint_Y 
= Convert.ToSingle(Origin_y);
            objGraphics.DrawLine(axisPen, FirstPoint_X, FirstPoint_Y, SecondPoint_X, SecondPoint_Y);
            
//画箭头上半边
            FirstPoint_X = Convert.ToSingle(Origin_x + _xWidth - 5);
            FirstPoint_Y 
= Convert.ToSingle(Origin_y - 5);
            SecondPoint_X 
= Convert.ToSingle(Origin_x + _xWidth);
            SecondPoint_Y 
= Convert.ToSingle(Origin_y);
            objGraphics.DrawLine(axisPen, FirstPoint_X, FirstPoint_Y, SecondPoint_X, SecondPoint_Y);
            
//画箭头下半边
            FirstPoint_X = Convert.ToSingle(Origin_x + _xWidth - 5);
            FirstPoint_Y 
= Convert.ToSingle(Origin_y + 5);
            SecondPoint_X 
= Convert.ToSingle(Origin_x + _xWidth);
            SecondPoint_Y 
= Convert.ToSingle(Origin_y);
            objGraphics.DrawLine(axisPen, FirstPoint_X, FirstPoint_Y, SecondPoint_X, SecondPoint_Y);

            
// 绘制Y轴上的刻度和文字
            DrawYAxis(objGraphics);

            
// 绘制X轴上的刻度和文字
            DrawXAxis(objGraphics);

            
// 绘制标题
            DrawTitle(objGraphics);

            
// 绘制数据曲线
            DrawCurve(objGraphics);

            
/**/////擦除Y轴画超出的部分

            
//objGraphics.FillRectangle(new SolidBrush(_imgBgColor), _beginX, _beginY, _imgWidth - _beginX - 2, _imgHeight - _beginY - 2);

            
// 绘制XY轴向说明文字
            DrawAxisText(objGraphics);

            objBitmap.Save(response.OutputStream, ImageFormat.Gif);


            objGraphics.Dispose();
            objBitmap.Dispose();
            response.End();


        }


        
// -----------------------------------------------------------------------------------------
        #endregion


        
private void DrawAxisText(Graphics objGraphics) // 绘制XY轴向说明文字#region private void DrawAxisText(Graphics objGraphics) // 绘制XY轴向说明文字
        
// ---------------------------------------------------------------------------------------------
        /**//// <summary>
        
/// 绘制XY轴向说明文字
        
/// </summary>
        
/// <param name="objGraphics">绘图对象</param>

        private void DrawAxisText(Graphics objGraphics)
        
{
            SolidBrush brush 
= new SolidBrush(_axisTextColor);
            Size xTextSize 
= TextImgSize.GetSize(_xTitle, _font);
            Size yTextSize 
= TextImgSize.GetSize(_yTitle, _font);

            objGraphics.DrawString(_xTitle, _font, brush, Origin_x 
+ _xWidth - xTextSize.Width - 2, Origin_y + Convert.ToInt32(_imgHeight * 0.01));
            objGraphics.DrawString(_yTitle, _font, brush, Origin_x 
+ 5, paddingheight+TitleHeight-5);
        }

        
// ---------------------------------------------------------------------------------------------
        #endregion


        
private void DrawXAxis(Graphics objGraphics) // 绘制X轴刻度和文字#region private void DrawXAxis(Graphics objGraphics) // 绘制X轴刻度和文字
        
// ---------------------------------------------------------------------------------------------
        /**//// <summary>
        
/// 绘制X轴刻度和文字
        
/// </summary>
        
/// <param name="objGraphics">绘图对象</param>

        private void DrawXAxis(Graphics objGraphics)
        
{
            
int startY = Origin_y - 2;
            
int endY = Origin_y + 2;
            
//文字位置Y轴方向开始坐标=图片高-边界高-刻度预留+文字高
            int textStartY = _imgHeight - paddingheight - 4 + _yTextLength;
            Pen pen 
= new Pen(new SolidBrush(_axisColor));
            SolidBrush brush 
= new SolidBrush(_sliceTextColor);
            Size textSize;
            
//遍历所有大刻度数目
            for (int i = 0; i < _xMaxScaleCount; i++)
            
{
                
//绘制X轴上的刻度
                objGraphics.DrawLine(pen, Origin_x + i * _xBigSpace, Origin_y - 2, Origin_x + i * _xBigSpace, Origin_y + 2);
                textSize 
= TextImgSize.GetSize(_xScalueValue[i], _font);
                
//绘制X轴上的值
                objGraphics.DrawString(_xScalueValue[i], _font, brush, Origin_x + i * _xBigSpace, Origin_y+Convert.ToInt32(_imgHeight*0.01));
            }

        }

        
// ---------------------------------------------------------------------------------------------
        #endregion


        
private void DrawYAxis(Graphics objGraphics) // 绘制Y轴刻度和文字#region private void DrawYAxis(Graphics objGraphics) // 绘制Y轴刻度和文字
        
// ---------------------------------------------------------------------------------------------
        /**//// <summary>
        
/// 绘制Y轴刻度和文字
        
/// </summary>
        
/// <param name="objGraphics">绘图对象</param>

        private void DrawYAxis(Graphics objGraphics)
        
{
            SolidBrush brush 
= new SolidBrush(_sliceTextColor);
            Pen pen 
= new Pen(new SolidBrush(_axisColor));
            Size textSize;
            
decimal value = Convert.ToDecimal(_yMinValue);
            
string text;
            
//遍历
            for (int i = 0; i < Yscalecount+1; i++)
            
{
                
if (i > 0)
                
{

                    objGraphics.DrawLine(pen, Origin_x 
- 4, Origin_y - i * _ySpace, Origin_x, Origin_y - i * _ySpace);
                    value 
+= Convert.ToDecimal(_yScaleBaseValue);
                }

                text 
= value.ToString();
                textSize 
= TextImgSize.GetSize(text, _font);
                objGraphics.DrawString(text, _font, brush, Origin_x 
- textSize.Width - 2, Origin_y - i * _ySpace - textSize.Height / 2);
            }

        }

        
// ---------------------------------------------------------------------------------------------
        #endregion


        
private void DrawTitle(Graphics objGraphics) // 绘制标题#region private void DrawTitle(Graphics objGraphics) // 绘制标题
        
// ---------------------------------------------------------------------------------------------
        /**//// <summary>
        
/// 绘制标题
        
/// </summary>
        
/// <param name="objGraphics">绘图对象</param>

        private void DrawTitle(Graphics objGraphics)
        
{
            SolidBrush brush 
= new SolidBrush(_imgTitleColor);
            Size textSize 
= TextImgSize.GetSize(_imgTitle, _font);
            objGraphics.DrawString(_imgTitle, titlefont, brush, (_imgWidth 
- textSize.Width-paddingwidth*2)/25);
        }

        
// ---------------------------------------------------------------------------------------------
        #endregion


        
private void DrawCurve(Graphics objGraphics) // 绘制数据曲线#region private void DrawCurve(Graphics objGraphics) // 绘制数据曲线
        
// ---------------------------------------------------------------------------------------------
        /**//// <summary>
        
/// 绘制数据曲线
        
/// </summary>
        
/// <param name="objGraphics">绘图对象</param>

        private void DrawCurve(Graphics objGraphics)
        
{
            Pen curvePen 
= new Pen(_curveColor, 1);
            PointF[] curvePointF 
= null;
            
if (_values.Length > 1)
            
{
                curvePointF 
= new PointF[_values.Length];
                
for (int i = 0; i < _values.Length; i++)
                
{
                    curvePointF[i] 
= new PointF(Origin_x + i * _xSmallSpace, Origin_y - _yHeight * _values[i] / _yScaleMaxValue);
                }

                objGraphics.DrawCurve(curvePen, curvePointF, _tension);
            }

            
        }

        
// ---------------------------------------------------------------------------------------------
        #endregion


        
private static void GetTopAndEnd(float maxvalue, float minvalue, out int topvalue, out int bottomvalue) //输入最大最小值,返回最高坐标与最低坐标#region private static void GetTopAndEnd(float maxvalue, float minvalue, out int topvalue, out int bottomvalue) //输入最大最小值,返回最高坐标与最低坐标
        
// -----------------------------------------------------------------------------------------
        /**//// <summary>
        
/// 输入最大最小值,返回最高坐标与最低坐标
        
/// </summary>
        
/// <param name="maxvalue">最大值</param>
        
/// <param name="minvalue">最小值</param>
        
/// <param name="topvalue">最高坐标</param>
        
/// <param name="bottomvalue">最低坐标</param>

        private static void GetTopAndEnd(float maxvalue, float minvalue, out int topvalue, out int bottomvalue)
        
{
            
int MaxDigit = 1;    //最大数的位数
            
//MaxDigit = Convert.ToInt32(Math.Log10(Convert.ToDouble(maxvalue)));
            MaxDigit = maxvalue.ToString().Length;
            
//int MinDigit = 1;   //最小数的位数
            
//MinDigit = Math.Log10(Convert.ToDouble(minvalue)) + 1;

            
int BaseValue = Convert.ToInt32(Math.Pow(10, MaxDigit - 1));    //基数
            string temp = maxvalue.ToString();
            temp 
= temp.Substring(01);
            
int BigFirstValue = Convert.ToInt32(temp);    //大数中最高位的数值
            BigFirstValue = BigFirstValue + 1;
            
//最高坐标=大数中最高位的数值*基数
            topvalue = BigFirstValue * BaseValue;
            
//如果最小值大于基数
            if (minvalue > BaseValue)
            
{
                temp 
= minvalue.ToString();
                temp 
= temp.Substring(01);
                
int SmallFirstValue = Convert.ToInt32(temp);  //小数中最高位的数值
                bottomvalue = SmallFirstValue * BaseValue;
                
            }

            
else
            
{
                bottomvalue 
= 0;
                
            }

        }
 
        
// -----------------------------------------------------------------------------------------
        #endregion

    }


    
public class TextImgSize    //文字区域的大小#region public class TextImgSize    //文字区域的大小
    
// -----------------------------------------------------------------------------------------
    /**//// <summary>
    
/// 文字区域的大小
    
/// </summary>

    public class TextImgSize
    
{
        
private static // 静态成员数据区#region private static // 静态成员数据区
        
// ---------------------------------------------------------------------------------------------
        private static Graphics _graph = Graphics.FromImage(new Bitmap(11));
        
// ---------------------------------------------------------------------------------------------
        #endregion


        
public static TextImgSize GetSize(string text, Font font) // 获取文字图像的大小#region public static TextImgSize GetSize(string text, Font font) // 获取文字图像的大小
        
// ---------------------------------------------------------------------------------------------
        /**//// <summary>
        
/// 获取文字图像的大小
        
/// </summary>
        
/// <param name="text">文字内容</param>
        
/// <param name="font">字体</param>
        
/// <returns>返回文字图像的大小</returns>

        public static Size GetSize(string text, Font font)
        
{
            
return _graph.MeasureString(text, font).ToSize();
        }

        
// ---------------------------------------------------------------------------------------------
        #endregion

    }
 
    
// -----------------------------------------------------------------------------------------
    #endregion

}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 香港公司在大陆卖地皮资金怎么办 结婚证上的身份证号码错了怎么办 身份证快过期了人在外地怎么办 邮政电话银行登录密码忘记了怎么办 如果欠了3w不敢和家里说怎么办 大四学生欠了3w该怎么办 房子付了首付贷款贷不下来怎么办 浙江嵊泗人在金华丢了身份证怎么办 一证5号够了怎么办新卡 微信号被盗实名认证是自己的怎么办 苹果微信登录显示被盗风险怎么办 在诈骗公司上班被公安抓了怎么办 在国外护照不小心撕坏了怎么办 在俄罗斯护照超期拉黑应该怎么办 俄罗斯五年定居护照丢了怎么办 百家号文章质量分一直在下降怎么办 如果在韩国把护照弄丢了怎么办 坐亲戚的车出了车祸受伤怎么办 出了车祸受伤对方不拿医药费怎么办 如果找你买保险的不在了保单怎么办 赴美生子父母一方是绿卡怎么办 农保报销需要居住证过期了怎么办 有上海户口但没有户口本怎么办护照 签证用的旧护照丢失了英签怎么办 买的动迁房房东不肯过户怎么办 身份信息在qq邮箱泄露了怎么办 别人用我的身份证贷款不还怎么办 做兼职被骗了身份证泄露了怎么办 qq绑定的手机号被别人换了怎么办 银行卡丢失不知道卡号和密码怎么办 美团景点门票过了退款期怎么办 我的手机汽车之家无法看视频怎么办 来事泡温泉细菌感染外阴瘙痒怎么办 西澳大学语言班没通过怎么办 银行入职培训理论考试不合格怎么办 去泰国旅游不会泰语和英语的怎么办 老板不发工资怎么办没签合同的 3d模型导进去材质丢失怎么办 七日杀显示载入中之后进不去怎么办 进京证过期了车在北京怎么办 微信打字时剪切的东西丢了怎么办