NET简单的一个画图程序


using System;
using System.Drawing;
//HttpUtility.UrlEncode

/// <summary>
///Curve 的摘要说明
/// </summary>
public class Curve
{
public Curve()
{
//
//TODO: 在此处添加构造函数逻辑
//
}

/*******************************************************属性设置**************************************************************/
/// <summary>
/// 房价数组
/// </summary>
private string[] _CurveData;
/// <summary>
/// 房价时间
/// </summary>
//private string[] _CurveDate;
public string[] CurveData
{
get { return _CurveData; }
set { _CurveData = value; }
}
//public string[] CurveDate
//{
// get { return _CurveDate; }
// set { _CurveDate = value; }
//}

/// <summary>
/// 是否显示曲线
/// </summary>
private bool _IsDemonstrationCurve=true;
public bool IsDemonstrationCurve
{
get { return _IsDemonstrationCurve;}
set {
if(value==false)
{
_IsDemonstrationCurve = false;
}else
{
_IsDemonstrationCurve = true;
}

}
}
/// <summary>
/// 是否显示 矩形图
/// </summary>
private bool _IsDemonstrationRectangle=true;
public bool IsDemonstrationRectangle
{
get { return _IsDemonstrationRectangle; }
set
{
if(value==false)
{
_IsDemonstrationRectangle = false;
}else
{
_IsDemonstrationRectangle = true;
}
}

}
/*****************************************属性设置结束***********************************************************************************/

public bool getCurve(string FileName)
{

try
{
/***********************大图的参数*****************************/
/*自写编码*/
int ImgWidth = 900; //1.[总宽度] ***图宽度
int ImgHeight = 550; //2.[总高度] ***图高度
int ItemNum = 1; //3.[项目数量] ***图表划分的块
//int ChildSpace=15; //6.[各块间的间距]
int ChartLeft = 80; //7.[图表左边距] ***图表距图的左边距离
int ChartRight = 50; //8.[图表右边距] ***图表距图的右边距离
int ChartTop = 50; //9.[图表顶边距] ***图表距图顶边距离
int ChartBottom = 50; //10.[图表底边距] ***图表距图底边距离

/*************************坐标位置调整******************************************/
int YMaxValue = 8000; //11.[纵坐标标尺最大值] ***纵坐标标尺的最大值
int YItemNum = 15; //12.[纵坐标标尺段数] ***纵坐标标尺的段数
int YTop = 15; //13.[距纵轴顶端间隔]
int YStrStart = 35; //14.[纵坐标标尺文字起始X坐标]
int XRight = 15; //15.[距横轴右端间隔]
int XStrStart = 20; //16.[横坐标标尺文字起始Y坐标]

/*************************小刻度位置调整*********************************/
int ChildNum = 4; //4.[块数] ***大块中划分的子项的数量
float ChildRate = 0.6f; //5.[各块总占空间比率]
int xiaoSpacing = 80; //小标示和小刻度之间的距离
int Xxiaospace_between = 35; //矩形距离小刻度的位置
int intjiange = 300; //顶部名称说明距离 左边的距离

string[] strGIFName = new string[ItemNum]; //大标示 注意和项目个数有联系
//string strGIFName = "2009年价格走势图";
/*因为 最近要换 所以 只有今年的*/
for (int intGIF = 1; intGIF <= ItemNum; intGIF++)
{

strGIFName[intGIF - 1] = 2008 + intGIF + "年价格走势图";
// arrValueNames[1] = "2010年价格走势图";
// arrValueNames[2] = "2011年价格走势图";
}

/*****************************各项数值的计算****************************************/
//[图表总宽度]=[总宽度]-[图表左边距]-[图表右边距]-[距横轴右端间隔]
int chartwidth = ImgWidth - ChartLeft - ChartRight - XRight;
//[项目宽度]=[图表总宽度]/[项目数量]
int itemwidth = chartwidth/ItemNum;
//[各块总占空间比率的实际宽度]=[项目宽度]*[各块总占空间比率]
int factwidth = Convert.ToInt32(Math.Floor(itemwidth*ChildRate));
//[各块矩形宽度]=[各块总占空间比率的实际宽度]/[块数]
int rectanglewidth = factwidth/ChildNum;
//[各块间的间距]=([项目宽度]-[各块总占空间比率的实际宽度])/([块数]+1)
int falge = ((itemwidth - factwidth)/(ChildNum + 1));
decimal myFale = falge;
int childspace = Convert.ToInt32(Math.Floor(myFale));
//(itemwidth-factwidth)/(ChildNum+1)

/***********************************开始画图******************************************************/
Graphics objGps; //建立画板对象
Bitmap objBitMap = new Bitmap(ImgWidth, ImgHeight); //建立位图对象
objGps = Graphics.FromImage(objBitMap); //根据位图对象建立画板对象
objGps.Clear(Color.White); //设置画板对象的背景色
/***************************横坐标设置*************************************************/
string[] strArrValueName = new string[ChildNum]; //标示名称(月份) 注意长度要和ChildNum 相同 //横坐标设置
for (int intquarter = 1; intquarter <= strArrValueName.Length; intquarter++)
{
if (intquarter%4 == 1)
{
strArrValueName[intquarter - 1] = "1~3月";
}
if (intquarter%4 == 2)
{
strArrValueName[intquarter - 1] = "4~6月";
}
if (intquarter%4 == 3)
{
strArrValueName[intquarter - 1] = "7~9月";
}
if (intquarter%4 == 0)
{
strArrValueName[intquarter - 1] = "10~12月";
}
}

/****************************数据的赋值*******************************/
/*********************************************************************/
//显示的数据
int[] arrValues = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; //数据数组
//CurveData

for (int inttheNum = 0; inttheNum <ChildNum; inttheNum++)
{

/* (ImgHeight - ChartBottom - ChartTop - YTop)/YItemNum*i 纵坐标的计算方法 */
//ImgHeight - ChartBottom - ChartTop - YTop 总高度-距离顶部高度-距离底部高度-y坐标距离顶部高度/标示个数个数=单个坐标的高度
// ImgHeight - ChartBottom-单个坐标的高度 总高度-距离底部高度-单个项目的高度
double dange = (ImgHeight - ChartBottom - ChartTop - YTop)/YItemNum; //单个高度的计算

double floatfalge = (double.Parse(CurveData[inttheNum])) * dange;
// double floatfalge = (ImgHeight - ChartBottom - ChartTop - YTop)*(inttheNum + 1)*400/YMaxValue;
arrValues[inttheNum] = Convert.ToInt32(Math.Floor(floatfalge));
}

/***************************************纵坐标显示标示设置*******************************************/
//string[] arrValueNames = {"0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"};
string[] arrValueNames = new string[YItemNum]; //这里表示所有的纵坐标的标示度名称
for (int intValueName = 0; intValueName < arrValueNames.Length; intValueName++)
{
arrValueNames[intValueName] = ((intValueName*500) + 2000).ToString();
}

//得出矩形宽度,和画图X轴位置

//[项目宽度]=[总宽度]/[项目数量]
//======[各块总占空间比率]=([各块矩形宽度]+[各块间的间距])/[项目宽度]
//[各块总占空间比率的实际宽度]=[项目宽度]*[各块总占空间比率]
//[各块矩形宽度]=([各块总占空间比率的实际宽度]-[各块间的间距]*([块数]))/[块数]
//[一边空余空间宽度]=([项目宽度]-[各块所占空间比率的总宽度])/2

System.Drawing.Point[] pi = new Point[arrValues.Length]; //定义折线点的对象数组
System.Drawing.Point[] pit = new Point[3]; //定义坐标三角点的对象数组
System.Drawing.Pen pe = new Pen(new SolidBrush(GetColor(7)), 1f); //定义画直线的对象
//画纵轴
objGps.DrawLine(pe, new Point(ChartLeft, ImgHeight - ChartBottom), new Point(ChartLeft, ChartTop));
//画纵轴终点箭头
pit[0].X = ImgWidth - ChartRight; //确定三角形三点的位置
pit[0].Y = ImgHeight - ChartBottom - 4;
pit[1].X = ImgWidth - ChartRight;
pit[1].Y = ImgHeight - ChartBottom + 4;
pit[2].X = ImgWidth - ChartRight + 10;
pit[2].Y = ImgHeight - ChartBottom;
objGps.FillPolygon(new SolidBrush(GetColor(7)), pit);
//画纵轴标尺和标尺描述
for (int i = 1; i <= YItemNum; i++)
{
//画标尺
objGps.DrawLine(pe,
new PointF(ChartLeft,
ImgHeight - ChartBottom -
(ImgHeight - ChartBottom - ChartTop - YTop)/YItemNum*i),
new PointF(ChartLeft - 5,
ImgHeight - ChartBottom -
(ImgHeight - ChartBottom - ChartTop - YTop)/YItemNum*i));
//画描述
objGps.DrawString(arrValueNames[i - 1].ToString(), new Font("宋体", 10), Brushes.Black,
new Point(YStrStart,
ImgHeight - ChartBottom -
(ImgHeight - ChartBottom - ChartTop - YTop)/YItemNum*i - 5));
}
//画横轴
objGps.DrawLine(pe, new Point(ChartLeft, ImgHeight - ChartBottom),
new Point(ImgWidth - ChartRight, ImgHeight - ChartBottom));
//画横轴终点箭头
pit[0].X = ChartLeft - 3; //确定三角形三点的位置
pit[0].Y = ChartTop;
pit[1].X = ChartLeft + 3;
pit[1].Y = ChartTop;
pit[2].X = ChartLeft;
pit[2].Y = ChartTop - 10;
objGps.FillPolygon(new SolidBrush(GetColor(7)), pit);
//画横轴标尺和标尺描述

arrValueNames = strGIFName;

for (int i = 1; i <= ItemNum; i++)
{
//i表示画的 第几个 ImgHeight - ChartBottom + 5 表示线的长度
//pe 表示pen 定义的一只笔
// ChartLeft + itemwidth * i, ImgHeight - ChartBottom 横坐标=左边距+显示个数 ImgHeight - ChartBottom纵坐标=图片总高度-底边距离

objGps.DrawLine(pe, new PointF(ChartLeft + itemwidth*i, ImgHeight - ChartBottom),
new PointF(ChartLeft + itemwidth*i, ImgHeight - ChartBottom + 10)); //画横坐标大刻度

//画小刻度和标示
for (int j = 1; j <= ChildNum; j++)
{
//
float widthX; //定义起点和重点的横坐标
widthX = ChartLeft + itemwidth*j/ChildNum + (i - 1)*itemwidth;
//画小的刻度
objGps.DrawLine(pe, new PointF(widthX, ImgHeight - ChartBottom),
new PointF(widthX, ImgHeight - ChartBottom + 3));
//画小标示

//arrValueNames[]
// ChartLeft + childspace + itemwidth * (i - 1) 横坐标=左边距+间隔+个数
int widthxiao;
widthxiao = ChartLeft + xiaoSpacing + itemwidth*(j - 1)/ChildNum + itemwidth*(i - 1);
objGps.DrawString(strArrValueName[j - 1].ToString(), new Font("宋体", 9), Brushes.Blue,
new Point(widthxiao, ImgHeight - ChartBottom + XStrStart - 12));
}

objGps.DrawString(arrValueNames[i - 1].ToString(), new Font("宋体", 12), Brushes.Black,
new Point(ChartLeft + intjiange + itemwidth*(i - 1),
ImgHeight - ChartBottom + XStrStart));
}

//框架完成 开始画图
for (int intfalge = 1; intfalge <= ItemNum; intfalge++)
{

for (int j = 0; j < ChildNum; j++) //画矩形图和折线图
{
int theintwidth = 0;
//左边距+各块间距
theintwidth = ChartLeft + itemwidth * j / ChildNum + Xxiaospace_between + (intfalge - 1) * itemwidth;

if(IsDemonstrationRectangle==true)
{
//画矩形
//5表示距离小刻度的位置
//j * (childspace + rectanglewidth)) + childspace + ChartLeft
//画矩形里面的颜色
objGps.FillRectangle(new SolidBrush(GetColor(j)), theintwidth,
ImgHeight - ChartBottom - arrValues[j],
rectanglewidth, arrValues[j]);
//画矩形外框
objGps.DrawRectangle(Pens.Black, theintwidth, ImgHeight - ChartBottom - arrValues[j], rectanglewidth,
arrValues[j]);
}

//********************************画折线图****************************************************
if(IsDemonstrationCurve==true)
{
// pi[j].X = (j * (childspace + rectanglewidth)) + childspace + ChartLeft;
pi[j].X = theintwidth; //定义折线的横坐标
pi[j].Y = ImgHeight - ChartBottom - arrValues[j]; //纵坐标=图片总高度-底部高度-实际数值

pe.SetLineCap(System.Drawing.Drawing2D.LineCap.RoundAnchor,
System.Drawing.Drawing2D.LineCap.RoundAnchor,
System.Drawing.Drawing2D.DashCap.Round);
if (j > 0) //进行连线
{
objGps.DrawLine(pe, pi[j - 1], pi[j]);
}
}
}
}

//objBitMap.Save(Response.OutputStream, ImageFormat.Gif);//该位图对象以"GIF"格式输出
//objBitMap.Save();//进行保存
System.Web.HttpServerUtility myServer = System.Web.HttpContext.Current.Server;
string strPath= myServer.MapPath("~/CurveGIF/");

//string strPath = System.Web.HttpContext.Current.Request.PhysicalApplicationPath.ToString() +
//"/CurveGIF/"+FileName+".gif";

objBitMap.Save(strPath+FileName+".gif");
pe.Dispose();
objBitMap.Dispose();
GC.Collect(); //资源释放 垃圾回收
return true;
}catch(Exception ex)
{
return false;
}
}

/**/
/// <param name="itemIndex">系统定义的颜色,有效值0到7,分别为(Blue,Yellow,Red,Orange,Purple,Brown,Pink,Black)</param>
/// <returns></returns>
public static Color GetColor(int itemIndex)
{
Color objColor = new Color();
switch (itemIndex)
{
case 0:
objColor = Color.Blue;
break;
case 1:
objColor = Color.Yellow;
break;
case 2:
objColor = Color.Red;
break;
case 3:
objColor = Color.Orange;
break;
case 4:
objColor = Color.Purple;
break;
case 5:
objColor = Color.Brown;
break;
case 6:
objColor = Color.Pink;
break;
case 7:
objColor = Color.Peru;
break;
case 8:
objColor = Color.PowderBlue;
break;
case 9:
objColor = Color.RosyBrown;
break;
case 10:
objColor = Color.RoyalBlue;
break;
case 11:
objColor = Color.SaddleBrown;
break;
case 12:
objColor = Color.SeaGreen;
break;
default:
objColor = Color.Black;
break;
}
return objColor;
}

/**/
/// <param name="red">自定义颜色红色分量值,有效值0到255</param>
/// <param name="green">自定义颜色绿色分量值,有效值0到255</param>
/// <param name="blue">自定义颜色蓝色分量值,有效值0到255</param>
/// <returns></returns>
public static Color GetColor(int red, int green, int blue)
{
Color objColor = new Color();
objColor = Color.FromArgb(red, green, blue);
return objColor;
}

}

然后这里是 调用的方法:


        Curve myCurve = new Curve();

/**设置参数**/
myCurve.IsDemonstrationCurve = true; //是否显示曲折线
myCurve.IsDemonstrationRectangle = false;//是否显示矩形
string[] strValue = {"2","3","1","1.5"};//显示的数据 现在只能显示4 个
myCurve.CurveData = strValue; //赋值
myCurve.getCurve(Guid.NewGuid().ToString());//创建GIF 保存
Response.Write("GIF生成成功!");

不过要注意的是  需要建立文件夹

出处:http://blog.csdn.net/jacky4955/article/details/4061658

NET简单的一个画图程序,布布扣,bubuko.com

时间: 2024-10-09 11:52:35

NET简单的一个画图程序的相关文章

一个画图程序(特别适合程序员)

一个画图神器,以后快速画图又有了一个新武器 图一: 代码: digraph directed { edge [fontname=NSimSun]; { a -> b; a -> c -> d [color=red,penwidth=3.0]; c -> e; a -> d[color=blue,label = "rank增加"]; } } 图二: graph hmc_graph{ "hmc01" -- "test520&quo

用GTK开发一个画图程序(windows)

GTK是一个功能强大的开发平台,跨系统,提供了丰富的庞大的代码库,应用开发者可以用之快速做出自己的产品. 这个月用他开发了一个GUI程序,是个画图工具,功能包括:图片导入导出.线型编辑.拖拽.删除.调整粗细.颜色.虚实.阴影,亮点是实现了一种自定义的线型:尖灭线(项目后续会加入更多线型).尖灭线是石油勘探资料处理中常用的绘图线型.GUI的使用流程是先导入一个底图,然后在底图之上画线或插入其他图片.文字,最后把整体导出为一个图片.上样例: 如图:企鹅图是背景图,蓝线是尖灭线,还有其他一些线和菜单.

简单搭建一个helloword程序

序言: 人生最大的遗憾不是失败,而是我本可以!挣扎了好久,决定开始做一些事,从简单入手,坚持下去,希望以后某一天回头还能看到一步一个脚印中的我! 搭建helloword程序 1.http://struts.apache.org/ 下载struts-2.3.32-all.zip: 2.创建web project程序,导入struts-2.3.32-all.zip中的struts2-blank.war解压缩lib中的jar包: 3.web.xml文件配置过滤器 <filter>    <fi

写给笨蛋徒弟的学习手册(2)——简单的画图程序(1)

简单的一个C#画图程序,实现画直线.圆.矩形.多边形以及橡皮擦的功能,可以自定义画笔颜色.线宽和橡皮擦大小. 通过这个程序,给你讲C#的一些基础知识,包括接口.继承.属性.如何引用命名空间和一点点的事件. 在这个程序中用到了C#自带的类库System.Drawing. 首先,先看一下最终的成果. ---------------------------- 假装有图 ---------------------------- 记得我告诉你的三个步骤吗? 1.首先整体思考,画图的话我们至少需要三方面,画

用L脚本语言开发一个简单的局域网聊天程序

#scp #这是一个简单的局域网聊天程序的例子 定义:字符串,string1 定义:字符串,string2 #addr1是对方的地址 #addr2是自己的地址 #如果addr1和addr2相同,就是自己和自己聊天 定义:地址,addr1,127.0.0.1,27015 定义:地址,addr2,127.0.0.1,27015 定义:整数,字节数,0 #在自己的UDP端口上监听 定义:网络连接,conn2,UDP 监听:conn2,addr2 #连接对方的UDP端口 定义:网络连接,conn1,UD

iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序

iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序 一.plist文件和项目结构图 说明:这是一个嵌套模型的示例 二.代码示例: YYcarsgroup.h文件代码: // // YYcarsgroup.h // 07-汽车展示(高级) // // Created by apple on 14-5-28. // Copyright (c) 2014年 itcase. All rights reserved. // #import <Foundation/Foundation.h> @

写一个ajax程序就是如此简单

写一个ajax程序就是如此简单 ajax介绍: 1:AJAX全称为Asynchronous JavaScript and XML(异步JavaScript和XML),指一种创建交互式网页应用的网页开发技术.     2:基于web标准XHTML+CSS的表示:     3:使用 DOM进行动态显示及交互:     4:使用 XML 和 XSLT 进行数据交换及相关操作:     5:使用 XMLHttpRequest 进行异步数据查询.检索: 程序员应用ajax的途经: 1:.Net下的Ajax

一个简单 的Shell 显示程序

#!/bin/bash clear declare FirstName Greeting   Greeting="Hello ," echo "" echo "Enter Your First Name:" read FirstName echo "$Greeting $FirstName" 首先   vim  Print  回车 然后   i   进入插入状态 编辑以上代码,Esc 键回车 输入   chmod  711 P

编写一个简单的jdbc例子程序

1 package it.cast.jdbc; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.ResultSet; 6 import java.sql.SQLException; 7 import java.sql.Statement; 8 9 public class Base { 10 11 public static void main(String[] args) th