动网论坛,站长建站首选,国内使用量最多的论坛软件 动网论坛官方技术讨论区 站长工具 申请属于您自己的免费论坛
首页 | 新闻资讯 | 网站运营 | 网络编程 | 数据库 | 服务器 | 网页设计 | 图像媒体 | 网络应用 | 搜索优化 | 资源下载 | 动网主机 | DVBOX
    本站内  互联网 ASP论坛  ASP.Net论坛  PHP论坛
  
   .Net → 阅读文章

 隨心所欲產生圖案

作者来源: 
阅读 1275 人次 , 2006-3-29 4:33:00 

要是沒有外部的元件支援,有一些東西是 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 圖案程式設計完整的使用操作。現在我們可以將 " 辦不到 " 這句話拋之腦後了。

 
 收藏本文  打印本文  论坛讨论  关闭窗口
· 上一篇:用ASP.NET实现一个简单的计算器
· 下一篇:使用ASP.NET 顯示事件日誌紀錄
· 创建移动Web应用程序(1)
· ASP.NET中树形图的实现
· ASP.Net中程序构架与程序代码的分离
· ASP.NET+XML Web服务客户端创建Web服务
· 利用关联将子关联记录取出


关于本站 | 联系我们 | 业务合作 | 客户案例 | 诚聘英才 | 广告合作 | 收藏本站
海口动网先锋网络科技有限公司版权所有
Copyright © 2000 - 2006 Cndw.Com
中华人民共和国电信与信息服务业务经营许可证编号 琼 ICP 020077