要是?有外部的元件支援,有一些?西是 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);
就??了! 只要? ImageFormat.PNG 交?成 ImageFormat.JPEG,你就能有 jpeg 的?案。??的使用?案,?就是我?一直想要的。
?在只是有?例外?理有待解?:一些函式?造成例外(例如,?有足?的?????生?像)。好的程式??者必?能?自行清除,我必??理?放 Graphics 和 Bitmap - 而?也就是我在 finally ??所做的 (因?他?是?被呼叫)。而在 finally 之後程式?束。
理?上??,??程式可以?作,但?在原始?中,要?它????行,必?先????:
csc /R:System.DLL /R:System.Drawing.DLL pagecounter.cs
??我?可以?生一 .EXE ? pagecounter.exe。注意:???案在系?安? Microsoft .NET framework 後才能?行喔!
?在 web server 上的工作
?作指令行?用程式?行起?相?棒,但如果作? ASP.NET script 就必?使用一些小技巧:
- 可??的文字 (例如,??器)
- 可??的文字?色
- 可??的背景?色
- 可??的字型
- 可??的字型大小
如果有人感到?有?困?的?,你可以先看一下???案的 ASP.NET script ?案 (pagecounter.aspx) 的原始? 原始?。 我所必?做的是加入一些???理程式???查?送的????。?可?是必?改?的最大部分。
另外必?做的是??案送到 client 端,而不是?它?入成?一??案。??新部分如下:
MemoryStream tempStream = new MemoryStream();newBitmap.Save(tempStream,ImageFormat.PNG);Response.ClearContent();Response.ContentType = "image/png";Response.BinaryWrite(tempStream.ToArray());Response.End();
我只是??案放入??????,然後?送到??熟悉的函式 BinaryWrite 是?位元?,同?:我需要??函式 ClearContent,因?在? Script 的最上部分有 Import 指令?送出空白列到 client 端,使得 PNG ???效。
如果你有仔?看一下 原始?,??注意到我已??送所有可??的??作? querystring ??。????可能太?,因此向我??的?人,我自己建?了一?看起?舒?一?的表? (form),??我就能??各?不同的值
〔?〕???案原先文字是德文,我在自己?器上???文字?成中文,因此,下?原始?是使用德文,你必?自己改成中文字。
?? ASP.NET page (pagecountertest.aspx) 更棒的是我可以在同一????得?案。?? form 的 原始? 已?包含?多 server 端的 ASP.NET 控制? (controls)。 ?意味著可作???文章中的?胃菜,在 ASP.NET 架?中?於 form 的?理以及??,?有???明。
??
在?篇文章中我?以?速?看?案程式的一些特徵。?於我?的?站??, ASP.NET 架?中?在能提供 web page 程式??者?於 Windows ?案程式??完整的使用操作。?在我?可以? " ?不到 " ?句??之?後了。