WEB开发网
开发学院WEB开发ASP.NET 随心所欲产生图案 阅读

随心所欲产生图案

 2007-12-15 09:35:13 来源:WEB开发网   
核心提示:要是没有外部的元件支援,有一些东西是 ASP 无法办到的,随心所欲产生图案,也就是动态产生图案 - 不管是图表、横幅广告、或是简单的图形计数器,幸运的是,图案完成了,我必须把它存到磁碟中,这在 ASP.NET 中已经改变了 - 使用内建的方法,图案可以动态产生以及能够用最大限度的组态设定能力传送到 client 端

要是没有外部的元件支援,有一些东西是 ASP 无法办到的,也就是动态产生图案 - 不管是图表、横幅广告、或是简单的图形计数器。幸运的是,这在 ASP.NET 中已经改变了 - 使用内建的方法,图案可以动态产生以及能够用最大限度的组态设定能力传送到 client 端,且很容易办到。

使用本文章的原始程式码必须在 Webserver 安装 Microsoft .NET Framework SDK。同时我也假设读者对 C# 程式有一定程度的认识。

产生图案

在还没感受到 ASP.NET 庞大压力下,我做了一个较乏味简单的指令行程式,然後使用这个原始程式码作为我们 ASP.NET script 的基础。所不同的是这个指令行会将图案储存为一档案,而 ASP.NET script 将他送到 client 端。

现在,我们的範例程式做了什麽?就像一般常见的,一开始我们使用一般喜欢用的 "Hello World" 程式,文字会输出成一图案档,然後图案会依据目前所选定的字型以及字型大小,产生同样大小的 "Hello World" 文字(因此,要产生特大的图像就无法计算)

下面的 Script (pagecounter.cs) 是典型简单的指令行程式: 忽略包裹在周围的 class , 只有函式 Main执行时会被呼叫,这也就是我们产生图案所在的程式。

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 会储存在 drive c:

图案如何产生?为了解原因,我们必须详细来看一下原始码。首先,图案大小必须是和要呈现的文字字型 "Hello World" 大小一样,因此,我会先计算文字大小,同时为达目的,我使用一个 size 1 x 1 的仿制图案,当我计算完成,我抓取图案然後产生一适当的大小图案。

原始码中有趣的一点是 Graphics 物件。当我要产生图像为何需要这物件呢? 理由是这是我要画进去的图案情境 (context) - 我可以在萤幕、印表机以及记忆体使用图案情境 - 正确来说就是 Bitmap。图案情境允许我在任何设备执行绘图操作 (既时是虚拟的)。

使用 DrawString,我现在可以根据白色背景 (使用 FillRectangle 产生) 的长方形规格输出文字 "Hello World"。图案完成了,我必须把它存到磁碟中。曾经有过自己设计过图案档格式都知道这是一件困难的事,使用 GDI+ (Graphics Device Interface) 就不是如此 - 我们只要使用一简单的命令就行了:

newBitmap.Save("c:\\test.png", ImageFormat.PNG);
		  

Tags:随心所欲 产生 图案

编辑录入:coldstar [复制链接] [打 印]
赞助商链接