打印本文 打印本文  关闭窗口 关闭窗口
?心所欲?生?案
作者:采集员 文章来源:来源于网络 点击数: 更新时间:2005/9/10 14:20:16

要是?有外部的元件支援,有一些?西是 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 的?案。??的使用?案,?就是我?一直想要的。

?在只是有?例外?理有待解?:一些函式?造成例外(例如,?有足?的?????生?像)。好的程式??者必?能?自行清除,我必??理?放 GraphicsBitmap - 而?也就是我在 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 ?案程式??完整的使用操作。?在我?可以? " ?不到 " ?句??之?後了。



打印本文 打印本文  关闭窗口 关闭窗口