程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> 如何在ASP.NET中隨意創建圖形信息

如何在ASP.NET中隨意創建圖形信息

編輯:關於C#
 

如果沒有一個外部組件的支持,在ASP中是不能動態創建圖形的,不管它是一個圖表,一個橫幅或僅僅是一個圖形計數器。可喜的是,這一點在ASP.NET中改變了。現在,我們只需要使用內置功能,就能夠很容易動態創建圖形,並向客戶端發送具有最佳配置的圖形。
用命令行程序創建圖形
在討論一大堆ASP.NET代碼之前,我們先執行一個簡單的命令行程序做一個測試,然後使用這些源代碼作為 ASP.NET 腳本的基礎。實際上,兩者的區別在於:命令行程序將圖形保存在一個文件中,而ASP.NET 腳本將圖形直接發送到客戶端。
舉例的程序做什麼呢?按照慣例,我們從眾所周知的"Hello World" 程序開始,把這個文本信息輸出到一個圖形文件中,這個圖形的大小要與當前選中的 "Hello World" 文本的字體和字號完全相同。
下面的腳本pagecounter.cs是一個典型的簡單命令行程序:如果忽略包圍在其周圍的必須的類代碼,就只剩下程序運行時要調用的主函數了,這也正是生成圖形的代碼所在處:
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,它將存放在C驅動器上:

我們來仔細研究一下源代碼,看看這個圖形是如何創建的。關鍵一點是生成的圖形必須與文本 "Hello World" 的字體和字號相同。因此,首先要計算文本的尺寸,為此我們使用了一個尺寸為1 x 1的虛擬圖形。計算結束之後,再廢棄這個虛擬圖形並生成一個適當尺寸的圖形。
源代碼中有一點很有趣,這就是 Graphics 對象。要創建一個位圖時,用這個對象做什麼呢?奧妙在於:這是可以向其中繪圖的上下文環境。我們可以在屏幕上、打印機上和內存中使用一個圖形上下文環境,准確地說就是一個位圖。圖形的上下文環境使我們能夠在任何設備上進行繪圖操作,甚至是在虛擬設備上。
接著,用DrawString將文本 "Hello World"按照規格輸出到一個白色背景的矩形(用 FillRectangle創建的)中。圖形完成後,將其保存在磁盤上。凡是親自研究過圖形文件格式的人都知道這有多困難,但是使用 GDI+ (圖形設備接口)就不那麼困難了,這只需要下面的簡單命令就可以:
newBitmap.Save("c://test.png", ImageFormat.PNG);
如果用ImageFormat.JPEG替換ImageFormat.PNG,就可以得到一個 jpeg文件。這正是我們所期待的操作圖形的最簡單用法。
例外處理代碼也很有必要,因為有些函數會造成例外,比如沒有足夠的內存用來創建位圖。而且,不要忘記釋放圖形和位圖,這是編程的良好習慣,有始有終嗎!最後,程序結束。
好了,現在請使用下面的命令將源代碼進行編譯,生成EXE文件pagecounter.exe,然後在安裝了Microsoft .NET框架的系統上測試運行:
csc /R:System.DLL /R:System.Drawing.DLL pagecounter.cs
在Web服務器上創建ASP.NET程序
上面的代碼作為一個命令行應用程序已經足夠了,但是要編寫相應的 ASP.NET 腳本,就必須再添加幾個功能:
●可選擇的文本(如一個計數器)
●可選擇的文本顏色
●可選擇的背景顏色
●可選擇的字體
●可選擇的字號
如果你認為這些太難做到了,那麼就請先看看相關的ASP.NET 腳本源代碼pagecounter.aspx。要提醒的是:增加任意數量的錯誤處理代碼以查看所傳遞參數的有效性,這是所必須做的修改中最大的一部分。
另一個需要修改的地方是將圖形發送給客戶端而不是將它寫入一個文件中。這個新部分的代碼是這樣的:
MemoryStream tempStream = new MemoryStream();
newBitmap.Save(tempStream,ImageFormat.PNG);
 
Response.ClearContent();
Response.ContentType = "image/png";
Response.BinaryWrite(tempStream.ToArray());
Response.End();
這裡只是將圖形"緩存"到內存中,然後將其作為一個字節數組傳遞給BinaryWrite函數。
仔細研究了源代碼的人會注意到這裡將所有可選擇參數都作為查詢字符串進行了傳遞,這可能會成為一個很長的尾巴

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved