隨心所欲產生圖案

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索net
, graphics
, 大小
, 文字
, 計算里程數
, 計算機原理
, 程式大小
, 原始
字型
随心所欲、随心所欲mercy、综漫之随心所欲、无限之随心所欲、随心所欲电影,以便于您获取更多的相关知识。

时间: 2024-10-29 05:56:37

隨心所欲產生圖案的相关文章

產生圖片隨機字串_php实例

<?php   $base = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';   $words = 5;   $rand_top = strlen($base) - 1;   $string = '';   header("Content-type: image/png");   $im = imagecreate($words*16, $words*5);   $black = imageco

Asp.net Textbox 輸入時間產生table

问题描述 各位大大您好:小女子有個想法,想在2textbox輸入開始跟結束時間然後產生一個table,請教如何建立呢,感謝大大的幫忙~~ 解决方案 解决方案二:DateTimedtStart=newDateTime(2015,01,01);DateTimedtEnd=newDateTime(2015,01,11);vardays=(dtEnd-dtStart).Days;Tabletb=newTable();for(vari=0;i<days;i++){TableRowrow;if(i%7==0

如何得到sqlcommandbuilder﹐sqldataadpter自動產生的updatecommand,deletecommand,insertcommand的完整sql語句。

问题描述 如何得到sqlcommandbuilder﹐sqldataadpter自動產生的updatecommand,deletecommand,insertcommand的完整sql語句. 解决方案 解决方案二:up解决方案三:SqlConnectionconnection=newSqlConnection(connectionString);SqlDataAdapteradapter=newSqlDataAdapter();adapter.SelectCommand=newSqlComman

黎姿产后靓丽出行血拼身形变圆润欲追生儿子

黎姿靓丽出行血拼(1 /11张) 自从去年7月诞下双胞胎女儿马家蔚和马家镁后,黎姿一直鲜有露面,似乎安居家中,静心过其幸福少奶奶的生活,生活如此优哉游哉,所以就算乐易玲三顾草庐,想邀其出山,黎姿仍然不为所动. 然而,未知是否呆在家中太久,黎姿终出来呼吸新鲜空气.上星期,记者发现她跟友人在中环出巡,身材除比之前更为窈窕,样子也比之前青春不少,看来是养尊处优,常食补品之效. 虽然黎姿容颜更胜于昔,可是有传她已经下定决心,专心再为马家继后香火,所以这个靓靓妈咪Look,只能闲中偶尔遇见,至于亮相幕前,

請問如何產生三角形的樣子

问题描述 要如何產生出像這樣的樣子* * * * * * * * * * * * * * ** * * * ** * * ** * ** ** <script language="JavaScript" type="text/JavaScript">for(x=1;x<=5;x++){ for(y=x;y<=5;y++){ document.write(y); } document.write("<br />"

請問如何依序產生數字

问题描述 我想要用js輸出數字123456789101112131415請問這個該怎麼做出來呢 问题补充:蔡华江 写道 解决方案 验证了一下....var arr= [];for(var i=1;i<=100;i++){ arr.push(i); arr.push(i%5==0?'<br/>':'t');}document.write(arr.join(''));解决方案二:引用不能跑出結果 寒个,当然不能跑,,漏了个i++.自己调一下呀...解决方案三:看错了.....抱歉 1楼的思路

新手玩Ajax幾個留意地方

ajax 跨網域限制  Browser不容許進行跨網域的XMLHttpRequest,甚至domain一樣,sub-domain不同,也不許可,跟Flash Player類似.同domain和sub-domain,不同Port,沒有限制.至於本地測試連至任何網域,IE容許,Firefox不容許.解決跨網域限制,常用方面當然跟Flash一樣,用一些Server-side Proxy程式負責載入跨網域數據.  XMLNode的Whitespace問題  即Flash裡面必須加的一句ignoreWhi

如何使用PagedDataSource來做DataRepeater的分頁的效果

ASP.NET中的DataList和DataRepeater提供了簡單快速的方法來展現資料,其<ItemTemplate>更是讓我們能隨心所欲的決定資料的排放方式.可惜的是他們不像Datagrid那樣,有內建的分頁功能. 如何解決這個不能分頁的問題呢?在這篇文章中將會介紹如何使用 PagedDataSource Class 來解決分頁的問題. 簡單的介紹幾個常用到的 PagedDataSource Class Public Properties DataSource - 資料來源AllowPa

一个比较郁闷的问题

问题描述 一个窗体,上面有三个按钮,一个文本框,一个grid控件单击第一个按钮时,随机生成5000个互不相同的(1,10000)之间的整形数,并将其绑定到grid控件中显示出来.单击第二个按钮时,对绑定在grid控件的这5000个数进行排序(由大到小)在文本框中输入一在该5000个数中的任意一个,便可实现查询,并直接定位到grid控件中的该条记录 解决方案 解决方案二:顶一下!解决方案三:第一个按钮自己写random生成随机数赋值DataTable,绑定grid第二个按钮DataTable.se