ASP.NET 2.0プログラミングテクニックResponseオブジェクトで画像を出力
一、紹介
ASPとしてNET基本オブジェクトの1つであるResponseオブジェクトは、Write()メソッドで直接ページに文字列データを出力するだけでなく、BinaryWrite()メソッドを使用して、画像、ピクチャなどのバイナリ表現のデータを直接表示することもできます.
この例では、ASP.でResponseオブジェクトを使用する方法を示します.NET 2.0 Webページには、SQL Server 2005データベースに直接格納されている画像データが出力されます.
【注意】本例では、SQL Server 2005テーブルのみに画像のURLを格納する場合については説明していない.このような状況は実際の開発で広く採用されている方法であるため,読者はWeb上で相応の使用例を探すのは難しくない.
まず,Webページに直接画像データを描画して出力する簡単な例を解析する.
二、直接Webページに画像データを描画して出力する
次のコード例では、ページを要求するときに3つの部分が重なる矩形を描画します.このコードはまずContentType属性をp_に設定するw_picpath/jpegは、ページ全体をJPEG画像として表示します.第2のステップでは、コードは、ヘッダを含む関係のないコンテンツがこの応答とともに送信されないことを保証するためにClearメソッドを呼び出す.ステップ3では、BufferOutputプロパティをtrueに設定し、ページを完全に処理した後、要求を発行したクライアントに送信します.ステップ4では、長方形を描くための2つのオブジェクト、すなわちBitmapオブジェクトとGraphicsオブジェクトを作成します.このページで作成した変数は、長方形を描く座標と、最大の長方形に表示される文字列として使用されます.
3つの長方形と表示される文字列を描画するときに、BitmapをOutputStreamプロパティに関連付けられたStreamオブジェクトに保存し、そのフォーマットをJPEGに設定します.次に、このコードはDisposeメソッドとDisposeメソッドを呼び出してリソースを解放します.これらのリソースは2つのペイントオブジェクトで使用されます.最後に、コードはFlushメソッドを呼び出し、バッファの応答を要求クライアントに送信する.
完全な実装コードは次のとおりです.
次に、データベースに直接保存されている画像データをASPページに出力する方法について説明します.
三、イベントデザイン
サンプルエンジニアリングのDispImage.aspxページの初期化関数Page_Load(object sender,EventArgs e)でResponseオブジェクトを使用して、SQL Server 2005 Express Editionデータベースに格納され、バイナリで表される画像を出力します.
コードでは、まずデータベースPictureDBのテーブルPictureTabからID値が1のピクチャを取得し、byte配列Dataを使用してピクチャのデータを保存します.次に、次の手順に基づいて、対応する画像を出力できます.
1.Responseオブジェクトの出力タイプを設定する.
2.出力画像のファイルヘッダ;
3.画像のバイナリデータを出力する.
4.出力を終了します.画像が大きすぎる場合は、出力バッファの方法も使用できます.
関数Page_Load(object sender,EventArgs e)のプログラムコードは以下の通りです.
四、付注とまとめ
上のページをaspxを初期ページに設定し、上記のサンプルエンジニアリングを実行します.この場合、ページにはデータベーステーブルに格納されている画像が表示されます.
実際には、画像データをデータベースに直接保存する必要がある場合があります.また、データベースにのみ画像ファイルのURLを格納し、実際の画像ファイルをサーバファイルシステムに格納する場合がある.パフォーマンスから見ると、このような大規模なデータをファイルに格納するのは速く、グラフィック担当者は画像にアクセスしやすく編集することができます.しかしながら、異なるマシン間でデータベースを移動する必要がある場合、このような大規模なデータをファイルに格納することは、ファイルがデータベースとの接続を容易に切断するため、最も困難な問題に直面する.したがって、データベースに直接保存すると、データの同期が容易になります.要するに、それぞれメリットとデメリットがあり、慎重に選択しなければならない.
ASPとしてNET基本オブジェクトの1つであるResponseオブジェクトは、Write()メソッドで直接ページに文字列データを出力するだけでなく、BinaryWrite()メソッドを使用して、画像、ピクチャなどのバイナリ表現のデータを直接表示することもできます.
この例では、ASP.でResponseオブジェクトを使用する方法を示します.NET 2.0 Webページには、SQL Server 2005データベースに直接格納されている画像データが出力されます.
【注意】本例では、SQL Server 2005テーブルのみに画像のURLを格納する場合については説明していない.このような状況は実際の開発で広く採用されている方法であるため,読者はWeb上で相応の使用例を探すのは難しくない.
まず,Webページに直接画像データを描画して出力する簡単な例を解析する.
二、直接Webページに画像データを描画して出力する
次のコード例では、ページを要求するときに3つの部分が重なる矩形を描画します.このコードはまずContentType属性をp_に設定するw_picpath/jpegは、ページ全体をJPEG画像として表示します.第2のステップでは、コードは、ヘッダを含む関係のないコンテンツがこの応答とともに送信されないことを保証するためにClearメソッドを呼び出す.ステップ3では、BufferOutputプロパティをtrueに設定し、ページを完全に処理した後、要求を発行したクライアントに送信します.ステップ4では、長方形を描くための2つのオブジェクト、すなわちBitmapオブジェクトとGraphicsオブジェクトを作成します.このページで作成した変数は、長方形を描く座標と、最大の長方形に表示される文字列として使用されます.
3つの長方形と表示される文字列を描画するときに、BitmapをOutputStreamプロパティに関連付けられたStreamオブジェクトに保存し、そのフォーマットをJPEGに設定します.次に、このコードはDisposeメソッドとDisposeメソッドを呼び出してリソースを解放します.これらのリソースは2つのペイントオブジェクトで使用されます.最後に、コードは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 = "p_w_picpath/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ページに出力する方法について説明します.
三、イベントデザイン
サンプルエンジニアリングのDispImage.aspxページの初期化関数Page_Load(object sender,EventArgs e)でResponseオブジェクトを使用して、SQL Server 2005 Express Editionデータベースに格納され、バイナリで表される画像を出力します.
コードでは、まずデータベースPictureDBのテーブルPictureTabからID値が1のピクチャを取得し、byte配列Dataを使用してピクチャのデータを保存します.次に、次の手順に基づいて、対応する画像を出力できます.
1.Responseオブジェクトの出力タイプを設定する.
2.出力画像のファイルヘッダ;
3.画像のバイナリデータを出力する.
4.出力を終了します.画像が大きすぎる場合は、出力バッファの方法も使用できます.
関数Page_Load(object sender,EventArgs e)のプログラムコードは以下の通りです.
1
protected
void
Page_Load(
object
sender,EventArgs e)
2
{ ///
3SqlConnection myConnection = new SqlConnection(
4ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRING"].ConnectionString);
5/// SQL
6string cmdText = "SELECT * FROM PictureTab WHERE PictureID='1'";
7/// Command
8SqlCommand myCommand = new SqlCommand(cmdText,myConnection);
9/// DataReader
10SqlDataReader dr = null;
11try
12{ ///
13myConnection.Open();
14///
15dr = myCommand.ExecuteReader(CommandBehavior.CloseConnection);
16}
17catch(SqlException ex)
18{ ///
19throw new Exception(ex.Message,ex);
20}
21///
22byte[] Data = null;
23while(dr.Read())
24{ ///
25Data = (byte[])dr["Data"];
26Response.ContentType = dr["Type"].ToString();
27}
28dr.Close();
29//
30this.EnableViewState = false;
31///
32Response.AppendHeader("Content-Length",Data.Length.ToString());
33///
34Response.BinaryWrite(Data);
35///
36Response.End();
37}
四、付注とまとめ
上のページをaspxを初期ページに設定し、上記のサンプルエンジニアリングを実行します.この場合、ページにはデータベーステーブルに格納されている画像が表示されます.
実際には、画像データをデータベースに直接保存する必要がある場合があります.また、データベースにのみ画像ファイルのURLを格納し、実際の画像ファイルをサーバファイルシステムに格納する場合がある.パフォーマンスから見ると、このような大規模なデータをファイルに格納するのは速く、グラフィック担当者は画像にアクセスしやすく編集することができます.しかしながら、異なるマシン間でデータベースを移動する必要がある場合、このような大規模なデータをファイルに格納することは、ファイルがデータベースとの接続を容易に切断するため、最も困難な問題に直面する.したがって、データベースに直接保存すると、データの同期が容易になります.要するに、それぞれメリットとデメリットがあり、慎重に選択しなければならない.