设为首页  
联系我们  
加入收藏  
网页制作 冲浪宝典 图形图像 操作系统 软件教学 编程开发 认证考试 安全技术 站长专区 文学驿站 娱乐天地 游戏天地 办公软件
文章搜索
您的位置: 首页 >> 文章首页 >> 编程开发 >> 网络编程 >> ASP.NET实例 >> 隨心所欲產生圖案
精品推荐
ASP.NET实例点击TOP10
·ASP.NET 程序中常用的三十三种代码
·设计ASP.NET新闻管理系统
·C#版的网站新闻发布系统
·利用ASP.NET构建网上考试系统
·ASP.NET的实时天气及24小时天气预报(C#)
·基于css样式绑定的样式驱动式AJAX程序开发(.net实现)
·ASP.NET里常用的JS
·用ASP.NET和XML做的新闻系统
·自己写的一个图形验证码页面(Asp.Net2.0通过)
·Asp.net+Xml开发网络硬盘
网络编程点击TOP10
·ASP.NET 程序中常用的三十三种代码
·CHK文件恢复工具
·.NET 初 级 读 本
·c#操作word表格
·『原创』C#中TreeView类操作全攻略:建立树,新增节点,删除节点,修改节点,拖动节点,与Oracle数据库交互操作(一)
·我的.NET书架 (入门篇)
·从零开始学ASP.NET(基础篇)
·十天学会ASP.net之第一天
·用C#实现木马程序
·官方水晶报表 .NET 应用程序实例下载 (C#、Visual C++.NET)
精选专题

隨心所欲產生圖案

作者: 来源:http://www.xgdown.com/ 时间:2005-11-5 0:04:26

隨心所欲產生圖案(1)

要是沒有外部的元件支援,有一些東西是 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) 的原始碼 20000728_code1.htm" target=_blank>原始碼。 我所必須做的是加入一些錯誤處理程式碼來檢查傳送的驗證參數。這可說是必須改變的最大部分。

另外必須做的是將圖案送到 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),這樣我就能測試各種不同的值


共2页 9 7 [1] [28 :>

隨心所欲產生圖案 相关文章:
隨心所欲產生圖案 相关软件:
特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
转载请注明来源:http://www.xgdown.com