この記事ではIHttpHandlerインターフェイスを実装して画像を生成して返す方法を紹介します。
以下2つの手順に従います。
- IHttpHandlerインターフェイスを実装した画像を出力するクラスを実装する
- 1のクラスをweb.configファイルへ登録する
- IHttpHandlerインターフェイスを実装すること
- 画像のバイナリデータをHTTPレスポンスへ出力すること
- Content-Typeヘッダを適切に設定すること
namespace HttpHandlerSample { // 動的にPNG画像を生成するクラス public class PngHandler : IHttpHandler { // このオブジェクトが再利用可能かを返すプロパティ public bool IsReusable { get { return true; } } // ...略... // HTTPリクエストを処理するメソッド public void ProcessRequest(HttpContext context) { // 画像を生成する using (var image = GenerateImage()) { // PNG形式でHTTPレスポンスへ出力する var output = context.Response.OutputStream; image.Save(output, ImageFormat.Png); output.Flush(); } // Content-TypeヘッダをPNG形式に設定する context.Response.ContentType = "image/png"; } // ...略... } }
IHttpHandlerにはIsReusableプロパティとProcessRequestメソッドが定義されています。このProcessRequestメソッドを実装することで機能を実現します。
画像のバイナリデータを出力するには、Image#Saveメソッドを使用します。
Content-Typeヘッダを指定するには、HttpResponse#ContentTypeプロパティを使用します。画像の形式が一致するように設定します。
次に、上のクラスをweb.configへ以下のように設定します。
以上で動的な画像の生成が実現できます。
以下、サンプルコード全体です。
画像のバイナリデータを出力するには、Image#Saveメソッドを使用します。
Content-Typeヘッダを指定するには、HttpResponse#ContentTypeプロパティを使用します。画像の形式が一致するように設定します。
次に、上のクラスをweb.configへ以下のように設定します。
<configuration> <system.webServer> <handlers> <add name="PngHandler" path="*.png" verb="GET" type="HttpHandlerSample.PngHandler"/> </handlers> </system.webServer> </configuration>ちなみに
以上で動的な画像の生成が実現できます。
以下、サンプルコード全体です。
using System; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Web; namespace HttpHandlerSample { // 動的にPNG画像を生成するクラス public class PngHandler : IHttpHandler { // 画像の幅 public const int Width = 200; // 画像の高さ public const int Height = 20; // フォントサイズ public const float FontSize = 10f; private readonly Font font; private readonly Brush brush; // このオブジェクトが再利用可能かを返すプロパティ public bool IsReusable { get { return true; } } public PngHandler() { font = new Font(FontFamily.GenericMonospace, FontSize); brush = Brushes.Red; } // HTTPリクエストを処理するメソッド public void ProcessRequest(HttpContext context) { // 画像を生成する using (var image = GenerateImage()) { // PNG形式でHTTPレスポンスへ出力する var output = context.Response.OutputStream; image.Save(output, ImageFormat.Png); output.Flush(); } // Content-TypeヘッダをPNG形式に設定する context.Response.ContentType = "image/png"; } // 画像を生成する private Image GenerateImage() { // このサンプルでは現在時刻を表示する画像を生成する var now = DateTime.Now; var strNow = now.ToString(); var bmp = new Bitmap(Width, Height); using (var graphic = Graphics.FromImage(bmp)) { graphic.DrawString(strNow, font, brush, 0f, 0f); } return bmp; } } }
0 件のコメント:
コメントを投稿