`
varsoft
  • 浏览: 2430888 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

在ASP.NET中随意创建图形信息

阅读更多
如果没有一个外部组件的支持,在ASP中是不能动态创建图形的,不管它是一个图表,一个横幅或仅仅是一个图形计数器。可喜的是,这一点在ASP.NET中改变了。现在,我们只需要使用内置功能,就能够很容易动态创建图形,并向客户端发送具有最佳配置的图形。
用命令行程序创建图形
在讨论一大堆ASP.NET代码之前,我们先执行一个简单的命令行程序做一个测试,然后使用这些源代码作为 ASP.NET 脚本的基础。实际上,两者的区别在于:命令行程序将图形保存在一个文件中,而ASP.NET 脚本将图形直接发送到客户端。
举例的程序做什么呢?按照惯例,我们从众所周知的"Hello World" 程序开始,把这个文本信息输出到一个图形文件中,这个图形的大小要与当前选中的 "Hello World" 文本的字体和字号完全相同。
下面的脚本pagecounter.cs是一个典型的简单命令行程序:如果忽略包围在其周围的必须的类代码,就只剩下程序运行时要调用的主函数了,这也正是生成图形的代码所在处:
using System;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
 
public class CTestBitmapFunctionality
{
public static void Main()
{
Bitmap newBitmap = null;
Graphics g = null ;
 
try
{
Font fontCounter = new Font("Lucida Sans Unicode", 12);
 
// calculate size of the string.
newBitmap = new Bitmap(1,1,PixelFormat.Format32bppARGB);
g = Graphics.FromImage(newBitmap);
SizeF stringSize = g.MeasureString("Hello World", fontCounter);
int nWidth = (int)stringSize.Width;
int nHeight = (int)stringSize.Height;
g.Dispose();
newBitmap.Dispose();
 
newBitmap = new Bitmap(nWidth,nHeight,PixelFormat.Format32bppARGB);
g = Graphics.FromImage(newBitmap);
g.FillRectangle(new SolidBrush(Color.White),
new Rectangle(0,0,nWidth,nHeight));
 
g.DrawString("Hello World", fontCounter,
new SolidBrush(Color.Black), 0, 0);
 
newBitmap.Save("c:\\test.png", ImageFormat.PNG);
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
finally
{
if (null != g) g.Dispose();
if (null != newBitmap) newBitmap.Dispose();
}
}
}
在任何情况下,执行上面代码后,就会生成下面的图形test.png,它将存放在C驱动器上:

我们来仔细研究一下源代码,看看这个图形是如何创建的。关键一点是生成的图形必须与文本 "Hello World" 的字体和字号相同。因此,首先要计算文本的尺寸,为此我们使用了一个尺寸为1 x 1的虚拟图形。计算结束之后,再废弃这个虚拟图形并生成一个适当尺寸的图形。
源代码中有一点很有趣,这就是 Graphics 对象。要创建一个位图时,用这个对象做什么呢?奥妙在于:这是可以向其中绘图的上下文环境。我们可以在屏幕上、打印机上和内存中使用一个图形上下文环境,准确地说就是一个位图。图形的上下文环境使我们能够在任何设备上进行绘图操作,甚至是在虚拟设备上。
接着,用DrawString将文本 "Hello World"按照规格输出到一个白色背景的矩形(用 FillRectangle创建的)中。图形完成后,将其保存在磁盘上。凡是亲自研究过图形文件格式的人都知道这有多困难,但是使用 GDI+ (图形设备接口)就不那么困难了,这只需要下面的简单命令就可以:
newBitmap.Save("c:\\test.png", ImageFormat.PNG);
如果用ImageFormat.JPEG替换ImageFormat.PNG,就可以得到一个 jpeg文件。这正是我们所期待的操作图形的最简单用法。
例外处理代码也很有必要,因为有些函数会造成例外,比如没有足够的内存用来创建位图。而且,不要忘记释放图形和位图,这是编程的良好习惯,有始有终吗!最后,程序结束。
好了,现在请使用下面的命令将源代码进行编译,生成EXE文件pagecounter.exe,然后在安装了Microsoft .NET框架的系统上测试运行:
csc /R:System.DLL /R:System.Drawing.DLL pagecounter.cs
在Web服务器上创建ASP.NET程序
上面的代码作为一个命令行应用程序已经足够了,但是要编写相应的 ASP.NET 脚本,就必须再添加几个功能:
●可选择的文本(如一个计数器)
●可选择的文本颜色
●可选择的背景颜色
●可选择的字体
●可选择的字号
如果你认为这些太难做到了,那么就请先看看相关的ASP.NET 脚本源代码pagecounter.aspx。要提醒的是:增加任意数量的错误处理代码以查看所传递参数的有效性,这是所必须做的修改中最大的一部分。
另一个需要修改的地方是将图形发送给客户端而不是将它写入一个文件中。这个新部分的代码是这样的:
MemoryStream tempStream = new MemoryStream();
newBitmap.Save(tempStream,ImageFormat.PNG);
 
Response.ClearContent();
Response.ContentType = "image/png";
Response.BinaryWrite(tempStream.ToArray());
Response.End();
这里只是将图形"缓存"到内存中,然后将其作为一个字节数组传递给BinaryWrite函数。
仔细研究了源代码的人会注意到这里将所有可选择参数都作为查询字符串进行了传递,这可能会成为一个很长的尾巴
分享到:
评论

相关推荐

    在ASp.net中随意创建图形信息

    使用DrawString()方法将图形输出到Web页面上

    ASP.NET编程百例(PDF)

    实例7在ASP.7NET中随意创建图形信息 实例8在ASP.8NET中显示事件日志记录(1) 实例9在ASP.9NET中显示事件日志记录(2) 实例10在ASP.10NET中使用DataGrid分页 实例11在ASP.11NET访问Excel2000/XP文件 实例12显示当前...

    asp.net知识库

    在Asp.net中如何用SQLDMO来获取SQL Server中的对象信息 使用Relations建立表之间的关系并却使用PagedDataSource类对DataList进行分页 通过作业,定时同步两个数据库 SQLSERVER高级注入技巧 利用反射实现ASP.NET控件和...

    ASP.NET编程百例 PDF扫描版 附源代码(vb.net)

    实例7在ASP 7NET中随意创建图形信息 实例8在ASP 8NET中显示事件日志记录 1 实例9在ASP 9NET中显示事件日志记录 2 实例10在ASP 10NET中使用DataGrid分页 实例11在ASP 11NET访问Excel2000 XP文件 实例12显示当前...

    MF00494-Core 5.0个人博客网站源码.zip

    ASP.NET Core 5.0 + Layui 个人博客网站源码 (带运行文档) 注意:不带技术支持,有帮助文件,虚拟商品,发货不退,看好再拍。 开发语言 : C# 数据库 : MySQL 开发工具 : VS2015 源码类型 : WebForm 基于.NET Core ...

    C#编程经验技巧宝典

    112 <br>0188 如何在ASP.NET中显示当前IE浏览器头信息 113 <br>5.6 其他应用技巧 114 <br>0189 如何判断年份是否为闰年 114 <br>0190 如何根据年份判断十二生肖 114 <br>0191 如何根据IP...

    resistor:这是一个测试

    创建一个ASP.NET MVC或React JS Web界面,该界面将允许某人使用您在第一步中创建的计算器。 使用您最喜欢的单元测试框架,编写您认为必要的单元测试,以充分测试您编写的代码作为对问题一的答案。 通过公共或私有...

    网上商城系统源码下载

    ·支持多语言 网奇Eshop是一个带有国际化语言支持的系统,可以同时在一个页面上显示全球任何一种语言而没有任何障碍、任何乱码。...可在一个商品大类中无限地创建商品小类,使网店可不断地扩大经营品种。 。。。。

    JavaScript网页特效范例宝典源码

    实例298 在ASP中利用Word自动打印指定格式的会议记录 470 实例299 在PHP中调用Word自动打印指定格式的会议记录 472 11.3 利用Excel打印报表 474 实例300 将Web页面中的数据导出到Excel 474 实例301 将Web页面中的...

    网管教程 从入门到精通软件篇.txt

    该信息在运行 fixboot 和 fixmbr 命令时非常有用。  map 命令仅在使用故障恢复控制台时才可用。  Map [ arc]  参数  arc  指示 map 命令显示高级 RISC 计算 (ARC)设备名称而不是设备名称。以下是 ARC 设备...

Global site tag (gtag.js) - Google Analytics