频道直达 - 学院 - 下载 - 交易 - 特效 - 字库 - 手册 -排名-工具- 繁體
网页教学网站开发 设为首页
加入收藏
联系我们
建站搜索: 常用广告代码   用户注册 | 用户登陆
您当前的位置:中国建站之家 -> 网站开发设计技术教程 -> Asp.Net教程 -> 隨心所欲產生圖案

隨心所欲產生圖案

作者:未知  来源:转载  发布时间:2005-7-20 9:39:47  发布人:acx

减小字体 增大字体

要是沒有外部的元件支援,有一些東西是 ASP 無法辦到的,也就是動態產生圖案 - 不管是圖表、橫幅廣告、或是簡單的圖形計數器。幸運的是,這在 ASP.NET 中已經改變了 - 使用內建的方法,圖案可以動態產生以及能夠用最大限度的組態設定能力傳送到 client 端,且很容易辦到。

使用本文章的原始程式碼必須在 Webserver 安裝 Microsoft .NET Framework SDK。同時我也假設讀者對 C# 程式有一定程度的認識。

產生圖案

在還沒感受到 ASP.NET 龐大壓力下,我做了一個較乏味簡單的指令行程式,然後使用這個原始程式碼作為我們 ASP.NET &#115cript 的基礎。所不同的是這個指令行會將圖案儲存為一檔案,而 ASP.NET &#115cript 將他送到 client 端。

現在,我們的範例程式做了什麼?就像一般常見的,一開始我們使用一般喜歡用的 "Hello World" 程式,文字會輸出成一圖案檔,然後圖案會依據目前所選定的字型以及字型大小,產生同樣大小的 "Hello World" 文字(因此,要產生特大的圖像就無法計算)

下面的 &#115cript (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:

screen.width-600)this.style.width=screen.width-600;">

圖案如何產生?為了解原因,我們必須詳細來看一下原始碼。首先,圖案大小必須是和要呈現的文字字型 "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 &#115cript 就必須使用一些小技巧:</P> <UL> <LI>可選擇的文字 (例如,計數器) <LI>可選擇的文字顏色 <LI>可選擇的背景顏色 <LI>可選擇的字型 <LI>可選擇的字型大小</LI></UL> <P>如果有人感到這有點困難的話,你可以先看一下這個圖案的 ASP.NET &#115cript 檔案 (<B>pagecounter.aspx</B>) 的原始碼 <a href="http://www.aspheute.com/artikel/20000728_code1.htm" target=_blank>原始碼</a>。 我所必須做的是加入一些錯誤處理程式碼來檢查傳送的驗證參數。這可說是必須改變的最大部分。 <P>另外必須做的是將圖案送到 client 端,而不是將它寫入成為一個檔案。這個新部分如下: </P><PRE style="BACKGROUND: silver">MemoryStream tempStream = new MemoryStream(); newBitmap.Save(tempStream,ImageFormat.PNG); Response.ClearContent(); Response.ContentType = "image/png"; Response.BinaryWrite(tempStream.ToArray()); Response.End(); </PRE> <P>我只是將圖案放入記憶體緩衝區,然後傳送到這個熟悉的函式 <I>BinaryWrite</I> 是為位元組,同時:我需要這個函式 <I>ClearContent</I>,因為在這 &#115cript 的最上部分有 <I>Import</I> 指令會送出空白列到 client 端,使得 PNG 圖檔無效。</P> <P>如果你有仔細看一下 <a href="http://www.aspheute.com/artikel/20000728_code1.htm" target=_blank>原始碼</a>,將會注意到我已經傳送所有可選擇的參數作為 querystring 參數。這樣參數可能太長,因此向我這樣的懶人,我自己建構了一個看起來舒適一點的表單 (form),這樣我就能測試各種不同的值</P> <P><img SRC="http://www.newasp.net/Upload/2004_Pack/20000728_2.png" width=468 border=0 onclick="java&#115;cript:window.open(this.src);" style="CURSOR: pointer" border="0" onmousewheel="return bbimg(this)" onload="java&#115;cript:if(this.width onclick="javascript:window.open(this.src);" style="CURSOR: pointer" onload="return imgzoom(this,550)">screen.width-600)this.style.width=screen.width-600;"> <br><font style="COLOR: blue">〔註〕這張圖案原先文字是德文,我在自己機器上測試將文字轉成中文,因此,下載原始檔是使用德文,你必須自己改成中文字。</font><br></P> <P>這個 ASP.NET page (<B>pagecountertest.aspx</B>) 更棒的是我可以在同一個網頁獲得圖案。這個 form 的 <a href="http://www.aspheute.com/artikel/20000728_code2.htm" target=_blank>原始碼</a> 已經包含許多 server 端的 ASP.NET 控制項 (controls)。 這意味著可作為將來文章中的開胃菜,在 ASP.NET 架構中對於 form 的處理以及驗證,會有詳盡說明。</P> <H2>結論</H2> <P>在這篇文章中我們以飛速來看圖案程式的一些特徵。對於我們的網站計劃, ASP.NET 架構中現在能提供 web page 程式設計者對於 Windows 圖案程式設計完整的使用操作。現在我們可以將 " 辦不到 " 這句話拋之腦後了。</P></div> <div></div> </div><div id="Message" class="Message"></div></font></div> <script type="text/javascript"> document.body.oncopy = function () { setTimeout( function () { var text = clipboardData.getData("text"); if (text) { text = text + "\r\n本篇文章来源于 中国建站之家 原文链接:"+location.href; clipboardData.setData("text", text); } }, 100 ) } </script> <br> <a href="javascript:window.open('http://shuqian.qq.com/post?from=3&title='+encodeURIComponent(document.title)+'&uri='+encodeURIComponent(document.location.href)+'&jumpback=2&noui=1','favit','width=930,height=470,left=50,top=50,toolbar=no,menubar=no,location=no,scrollbars=yes,status=yes,resizable=yes');void(0)" style="text-decoration:none;color:#155da5;display:block;background:url('http://shuqian.qq.com/img/add.gif') no-repeat 0px 0px;height:23px;width:300px;padding:2px 2px 0px 20px;font-size:14px;">将本文收藏到QQ书签与更多好友分享</a> <div></div> </td> <table width="575" border="0" cellpadding="0" cellspacing="0"> <tr> </tr> <tr> <td align="right" height=25 bgcolor=#F7F7F7 > <script language=javascript src=/wz/sg.JS></script> [<a href=javascript:window.print()>打 印</a>] </tr> </table> <table width="575" border="0" cellpadding="0" cellspacing="0"> <tr> </tr> <tr> <td align="right" height=25 bgcolor=#F7F7F7 style="display:block;padding:0px 10px"> <font color=#000000>[<script language=JavaScript src="/Article/Hits.Asp?ArticleID=4893"></script>]</font> [<a href="javascript:history.go(-1)">返回上一页</a>] [<a href="/user/favorite.asp?action=add&topic=隨心所欲產生圖案">收 藏</a>]</td> </tr> <tr> <table width="575" border="0" cellpadding="0" cellspacing="0"> <tr> </tr> <tr> <td style="display:block;padding:0px 10px"><div><font color=#000000>上一篇文章:</font><a href=/Article/10/131/2005/200507204892.html>ASP.NET结合存储过程写的通用搜索分页程序</a></div><div><font color=#000000>下一篇文章:</font><font color=#000000><a href=/Article/10/131/2005/200507204894.html>使用ASP.NET 顯示事件日誌紀錄</a></font></div></td> </tr> </table> <table width="575" border="0" cellpadding="0" cellspacing="0"> <tr> <td class="titlebg1">∷相关文章评论∷    (评论内容只代表网友观点,与本站立场无关!) [<a href=/Article/comment.asp?ArticleID=4893 target=_blank>更多评论</a>...]</td> </tr> <tr valign="top"> <td></td> </tr> </table> </td> <td width="188" class="tableleft"><table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td class="titleback1">精彩推荐</td> </tr> <tr> <td height="260" valign="center" class="showbody1"><script language=javascript src=/ad/180601.js></script></td> </tr> </table> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td class="titleback1">热门文章</td> </tr> <tr> <td height="100" valign="top" class="showbody1"><table width="100%" border="0" cellpadding="2" cellspacing="0"><tr> <td class="showlist11">· <a href='/Article/10/138/2005/200507256912.html' class="showlist" title="注册码大全二">注册码大全二</a></td> <td class="showlist11"></td> </tr><tr> <td class="showlist12">· <a href='/Article/10/138/2005/200507256914.html' class="showlist" title="注册码大全四">注册码大全四</a></td> <td class="showlist12"></td> </tr><tr> <td class="showlist11">· <a href='/Article/10/138/2005/200507256911.html' class="showlist" title="注册码大全一">注册码大全一</a></td> <td class="showlist11"></td> </tr><tr> <td class="showlist12">· <a href='/Article/196/197/2005/2005081911736.html' class="showlist" title="要10G免费网络硬盘的请进来!">要10G免费网络硬盘的请进..</a></td> <td class="showlist12"></td> </tr><tr> <td class="showlist11">· <a href='/Article/206/2007/2007030319347.html' class="showlist" title="通过google 赶快来赚美金">通过google 赶快来赚美金..</a></td> <td class="showlist11"></td> </tr><tr> <td class="showlist12">· <a href='/Article/10/138/2005/200507256919.html' class="showlist" title="注册码大全十">注册码大全十</a></td> <td class="showlist12"></td> </tr><tr> <td class="showlist11">· <a href='/Article/14/253/2005/2005092114218.html' class="showlist" title="头像-qq头像(qq新头像)4">头像-qq头像(qq新头像)4..</a></td> <td class="showlist11"></td> </tr><tr> <td class="showlist12">· <a href='/Article/13/150/2006/2006022316028.html' class="showlist" title="让你轻松架设FTP服务器1">让你轻松架设FTP服务器1..</a></td> <td class="showlist12"></td> </tr><tr> <td class="showlist11">· <a href='/Article/10/138/2005/200507256913.html' class="showlist" title="注册码大全三">注册码大全三</a></td> <td class="showlist11"></td> </tr><tr> <td class="showlist12">· <a href='/Article/14/244/2005/2005092014121.html' class="showlist" title="梦幻背景图片7">梦幻背景图片7</a></td> <td class="showlist12"></td> </tr><tr> <td class="showlist11">· <a href='/Article/14/249/2005/2005092114181.html' class="showlist" title="卡通动物图片6">卡通动物图片6</a></td> <td class="showlist11"></td> </tr><tr> <td class="showlist12">· <a href='/Article/14/269/2005/2005092114241.html' class="showlist" title="网页制作素材-按钮素材2">网页制作素材-按钮素材2..</a></td> <td class="showlist12"></td> </tr><tr> <td class="showlist11">· <a href='/Article/13/150/2006/2006022316032.html' class="showlist" title="让你轻松架设FTP服务器5">让你轻松架设FTP服务器5..</a></td> <td class="showlist11"></td> </tr><tr> <td class="showlist12">· <a href='/Article/14/244/2005/2005092014153.html' class="showlist" title="风景图片8">风景图片8</a></td> <td class="showlist12"></td> </tr><tr> <td class="showlist11">· <a href='/Article/10/138/2005/200507256918.html' class="showlist" title="注册码大全九">注册码大全九</a></td> <td class="showlist11"></td> </tr><tr> <td class="showlist12">· <a href='/Article/13/150/2006/2006022316029.html' class="showlist" title="让你轻松架设FTP服务器2">让你轻松架设FTP服务器2..</a></td> <td class="showlist12"></td> </tr></table></td> </tr> <tr> <td height="2" bgcolor="#FFFFFF"></td> </tr> </table> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td class="titleback1">关注此文读者还看过</td> </tr> <tr> <td height="100" valign="top" class="showbody1"><table width="100%" border="0" cellpadding="2" cellspacing="0"><tr> <td class="showlist11">· <a href='/Article/10/132/2005/200507192389.html' target="_blank" class="showlist" title="详细为您解析JSP的环境引擎--Websphere">详细为您解析JSP的环境引..</a></td> <td class="showlist11"></td> </tr><tr> <td class="showlist12">· <a href='/Article/10/130/2005/2005090412130.html' target="_blank" class="showlist" title="ASP漏洞集-用ASP实现网页保密的两种方法">ASP漏洞集-用ASP实现网页..</a></td> <td class="showlist12"></td> </tr><tr> <td class="showlist11">· <a href='/Article/223/291/2006/2006060516576.html' target="_blank" class="showlist" title="雅虎董事长年薪降至1美元 3年仅股权获利4.29亿">雅虎董事长年薪降至1美元..</a></td> <td class="showlist11"></td> </tr><tr> <td class="showlist12">· <a href='/Article/10/133/2005/200507216893.html' target="_blank" class="showlist" title="在 WIN 平台上让你的 Apache 2.0.45 支持 PHP">在 WIN 平台上让你的 Ap..</a></td> <td class="showlist12"></td> </tr><tr> <td class="showlist11">· <a href='/Article/223/291/2006/2006082117302.html' target="_blank" class="showlist" title="连锁网吧审批有望&quot;开闸&quot; 单体网吧解禁尚难定论">连锁网吧审批有望&quot;开闸&quot;..</a></td> <td class="showlist11"></td> </tr><tr> <td class="showlist12">· <a href='/Article/223/291/2006/2006090217456.html' target="_blank" class="showlist" title="深圳审理互联网不正当竞争纠纷 侵权网站赔6万">深圳审理互联网不正当竞..</a></td> <td class="showlist12"></td> </tr><tr> <td class="showlist11">· <a href='/Article/11/139/2005/200508019680.html' target="_blank" class="showlist" title="轻松打造弹出窗口">轻松打造弹出窗口</a></td> <td class="showlist11"></td> </tr><tr> <td class="showlist12">· <a href='/Article/10/130/2005/200507277721.html' target="_blank" class="showlist" title="ASP中五种连接数据库的方法(转)">ASP中五种连接数据库的方..</a></td> <td class="showlist12"></td> </tr><tr> <td class="showlist11">· <a href='/Article/223/291/2006/2006010215167.html' target="_blank" class="showlist" title="网络安全2005十大热点:流氓软件人人喊打">网络安全2005十大热点:..</a></td> <td class="showlist11"></td> </tr><tr> <td class="showlist12">· <a href='/Article/10/130/2005/200507205970.html' target="_blank" class="showlist" title="Top 和 Distinct 的 区别">Top 和 Distinct 的 区..</a></td> <td class="showlist12"></td> </tr><tr> <td class="showlist11">· <a href='/Article/10/130/2005/200507288351.html' target="_blank" class="showlist" title="将ASP代码移植为VB COM组件-2">将ASP代码移植为VB COM组..</a></td> <td class="showlist11"></td> </tr><tr> <td class="showlist12">· <a href='/Article/223/291/2006/2006021915969.html' target="_blank" class="showlist" title="3巨头前高管助阵 启明创投2亿美元猎艳中国互联网">3巨头前高管助阵 启明创..</a></td> <td class="showlist12"></td> </tr><tr> <td class="showlist11">· <a href='/Article/11/140/2005/200507181887.html' target="_blank" class="showlist" title="用FLASH MX制作动画卡通人物(3)-给人物上色">用FLASH MX制作动画卡通..</a></td> <td class="showlist11"></td> </tr><tr> <td class="showlist12">· <a href='/Article/190/192/2007/2007010318567.html' target="_blank" class="showlist" title="怎样才能把自己的网站做好?一定要知道的定律">怎样才能把自己的网站做..</a></td> <td class="showlist12"></td> </tr><tr> <td class="showlist11">· <a href='/Article/10/133/2005/200507216129.html' target="_blank" class="showlist" title="模拟 OICQ 的实现思路和核心程序(三) 转 --建议加入精华区">模拟 OICQ 的实现思路和..</a></td> <td class="showlist11"></td> </tr><tr> <td class="showlist12">· <a href='/Article/10/131/2005/200507256988.html' target="_blank" class="showlist" title="ASP.net中上传文件的操作">ASP.net中上传文件的操作..</a></td> <td class="showlist12"></td> </tr></table></td> </tr> </table> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td class="titleback1">相关文章</td> </tr> <tr> <td height="100" valign="top" class="showbody1"></td> </tr> </table> </td> </tr> </table> <table width="778" border="0" align="center" cellpadding="0" cellspacing="0" class="tableborder"> <tr> <td height="3"></td> </tr> </table> <table width="778" border="0" align="center" cellpadding="0" cellspacing="0" class="tableborder"> <tr> <td height="23" align="right"> <table width="100%" border="0" cellspacing="0" class="tablebody8" cellpadding="0"> <tr> <td height="5"></td> </tr> <tr> <td height="23" align="right" valign="middle"><center><a href="/support/about.asp" class="navmenu2">关于本站</a> - <a href="/support/help.asp" class="navmenu2">网站帮助</a> - <a href="/support/advertise.asp" class="navmenu2">广告合作</a> - <a href="/support/declare.asp" class="navmenu2">下载声明</a> - <a href="/link/" target="_blank" class="navmenu2">友情连接</a> - <a href="/support/sitemap.asp" class="navmenu2">网站地图</a> - <a href="#" target="_blank" class="navmenu2">人才招聘</a> </tr> </table></td> </tr> <tr> <td height="1"></td> </tr> </table> <table width="778" border="0" align="center" cellpadding="0" cellspacing="0" class="tableborder"> <tr> <td height="60" align="center" class="tablebody1">网站合作、内容监督、商务咨询:QQ: 9576619 <br> Copyright ? 2005--2008 中国建站之家版权所有 <br><a href="http://www.miibeian.gov.cn" target="_blank" title="粤ICP备05092265号"><font color=#000000>粤ICP备05092265号 </font><br><script src='http://s6.cnzz.com/stat.php?id=44148&web_id=44148&show=pic' language='JavaScript' charset='gb2312'></script> </td> <script language="javascript" src="/inc/Std_StranJF.Js"></script> </table> </body> </html> <span id="naruco_ad_body" style="display:none;"> <script language=javascript src=/adfile/top.js></script> </span> <script type="text/javascript"> var naruco_ad = document.getElementById('naruco_ad'); if (naruco_ad != null) { naruco_ad.innerHTML=naruco_ad_body.innerHTML; naruco_ad_body.innerHTML=""; } </script>