随心所欲产生图案
要是没有外部的元件支援,有一些东西是 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:
javascript:window.open(this.src);" style="cursor:pointer;"/>图案如何产生?为了解原因,我们必须详细来看一下原始码。首先,图案大小必须是和要呈现的文字字型 "Hello World" 大小一样,因此,我会先计算文字大小,同时为达目的,我使用一个 size 1 x 1 的仿制图案,当我计算完成,我抓取图案然後产生一适当的大小图案。
原始码中有趣的一点是 Graphics 物件。当我要产生图像为何需要这物件呢? 理由是这是我要画进去的图案情境 (context) - 我可以在萤幕、印表机以及记忆体使用图案情境 - 正确来说就是 Bitmap。图案情境允许我在任何设备执行绘图操作 (既时是虚拟的)。
使用 DrawString,我现在可以根据白色背景 (使用 FillRectangle 产生) 的长方形规格输出文字 "Hello World"。图案完成了,我必须把它存到磁碟中。曾经有过自己设计过图案档格式都知道这是一件困难的事,使用 GDI+ (Graphics Device Interface) 就不是如此 - 我们只要使用一简单的命令就行了:
newBitmap.Save("c:\\test.png", ImageFormat.PNG);