要是沒有外部的元件支援,有一些東西是 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 後才能執行喔!
當作指令行應用程式執行起來相當棒,但如果作為 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 圖案程式設計完整的使用操作。現在我們可以將 " 辦不到 " 這句話拋之腦後了。
相关视频
相关阅读 Windows错误代码大全 Windows错误代码查询激活windows有什么用Mac QQ和Windows QQ聊天记录怎么合并 Mac QQ和Windows QQ聊天记录Windows 10自动更新怎么关闭 如何关闭Windows 10自动更新windows 10 rs4快速预览版17017下载错误问题Win10秋季创意者更新16291更新了什么 win10 16291更新内容windows10秋季创意者更新时间 windows10秋季创意者更新内容kb3150513补丁更新了什么 Windows 10补丁kb3150513是什么
热门文章 360快剪辑怎么使用 36金山词霸如何屏幕取词百度收购PPS已敲定!3
最新文章
微信3.6.0测试版更新了微信支付漏洞会造成哪
360快剪辑怎么使用 360快剪辑软件使用方法介酷骑单车是什么 酷骑单车有什么用Apple pay与支付宝有什么区别 Apple pay与贝贝特卖是正品吗 贝贝特卖网可靠吗
人气排行 xp系统停止服务怎么办?xp系统升级win7系统方电脑闹钟怎么设置 win7电脑闹钟怎么设置office2013安装教程图解:手把手教你安装与qq影音闪退怎么办 QQ影音闪退解决方法VeryCD镜像网站逐个数,电驴资料库全集同步推是什么?同步推使用方法介绍QQ2012什么时候出 最新版下载EDiary——一款好用的电子日记本
查看所有0条评论>>