本文範例小專案將展示如何使用 Response 物件在 ASP.NET 2.0 Web 頁面中輸出直接儲存在 SQL Server 2005 資料庫中的圖片資料。直接在 Web 頁面上繪製並輸出圖片資料與事件設計。
作為 ASP.NET 基本物件之一的 Response 物件不僅可透過 Write() 方法直接在頁面輸出字串資料,還可使用 BinaryWrite() 方法直接顯示二進位資料,如圖片、圖像等。
本文範例小專案將展示如何使用 Response 物件在 ASP.NET 2.0 Web 頁面中輸出直接儲存在 SQL Server 2005 資料庫中的圖片資料。
【注意】本例未討論僅在 SQL Server 2005 資料表中儲存圖片 URL 的情形。因這是實際開發中廣為採用的方法,讀者不難在網上搜尋相應使用案例。
首先,讓我們分析一個簡單的直接在 Web 頁面上繪製並輸出圖片資料的例子。
下列程式碼範例在請求頁面時將繪製三個部分重疊的矩形。程式碼首先將 ContentType 屬性設為 image/jpeg,以便將整個頁面呈現為 JPEG 圖片。第二步,呼叫 Clear 方法確保不會將無關內容(包含標頭)與此回應一同發送。第三步,將 BufferOutput 屬性設為 true,使頁面完全處理後再發送給請求客戶端。第四步,建立兩個用於繪製矩形的物件,即 Bitmap 和 Graphics 物件。頁面中建立的變數將作為繪製矩形的座標和在最大矩形中顯示的字串。
繪製三個矩形和其中顯示字串時,將 Bitmap 儲存到與 OutputStream 屬性相關聯的 Stream 物件中,並將格式設為 JPEG。接著,呼叫 Dispose 方法釋放資源——這些資源為兩個繪製物件所使用。最後,呼叫 Flush 方法將緩衝回應發送給請求客戶端。
完整實作程式碼如下:
<%@ Page Language="C#" %>
<%@ import Namespace="System.Drawing" %>
<%@ import Namespace="System.Drawing.Imaging" %>
<%@ import Namespace="System.Drawing.Drawing2D" %>
<script runat="server">
private void Page_Load(object sender, EventArgs e)
...{
//設定頁面 content type 為 JPEG 檔案
//並清除所有回應標頭資訊
Response.ContentType = "image/jpeg";
Response.Clear();
//對回應作緩衝以便處理完成後發送頁面
Response.BufferOutput = true;
//建立字型風格
Font rectangleFont = new Font(
"Arial", 10, FontStyle.Bold);
//建立整數變數
int height = 100;
int width = 200;
//建立亂數產生器並基於它建立變數值
Random r = new Random();
int x = r.Next(75);
int a = r.Next(155);
int x1 = r.Next(100);
//建立一張位圖並使用它建立一個 Graphics 物件
Bitmap bmp = new Bitmap(
width, height, PixelFormat.Format24bppRgb);
Graphics g = Graphics.FromImage(bmp);
g.SmoothingMode = SmoothingMode.AntiAlias;
g.Clear(Color.LightGray);
//使用這個 Graphics 物件繪製 3 個矩形
g.DrawRectangle(Pens.White, 1, 1, width-3, height-3);
g.DrawRectangle(Pens.Aquamarine, 2, 2, width-3, height-3);
g.DrawRectangle(Pens.Black, 0, 0, width, height);
//使用這個 Graphics 物件輸出一個字串 on the rectangles.
g.DrawString(
"ASP.NET Samples", rectangleFont,
SystemBrushes.WindowText, new PointF(10, 40));
//在其中兩個矩形上添加顏色
g.FillRectangle(
new SolidBrush(
Color.FromArgb(a, 255, 128, 255)),
x, 20, 100, 50);
g.FillRectangle(
new LinearGradientBrush(
new Point(x, 10),
new Point(x1 + 75, 50 + 30),
Color.FromArgb(128, 0, 0, 128),
Color.FromArgb(255, 255, 255, 240)),
x1, 50, 75, 30);
//把位圖儲存到回應串流中並轉換成 JPEG 格式
bmp.Save(Response.OutputStream, ImageFormat.Jpeg);
//釋放 Graphics 物件和位圖使用的記憶體空間
g.Dispose();
bmp.Dispose();
//把輸出結果發送到客戶端
Response.Flush();
}
</script>
<html>
<head>
</head>
<body>
<form runat="server">
</form>
</body>
</html>
接下來,讓我們討論本文重點——如何在 ASP 頁面中輸出直接儲存在資料庫中的圖片資料。