どっとねっとふぁん

C# Tips And Samples
in 検索

22.サーバ上で画像を生成して表示する

最新の投稿は、投稿日時: 06-23-2005, 4:55 午後 投稿者: ono です。スレッドには 0 件の返答があります。
投稿のソート: 前へ 次へ
  •  06-23-2005, 4:55 午後 68

    22.サーバ上で画像を生成して表示する

    ASP.NETではサーバ上で画像を生成してダウンロードできるようになりました。
    まずサンプルで確認してみましょう。

    MyImage.aspx
    -------------------------------------------------------
    <%@ Page language="c#" %>
    <%@ Import NameSpace="System.Drawing" %>
    <%@ Import NameSpace="System.Drawing.Imaging" %>
    <script runat="server">
    void Page_Load(Object sender, EventArgs e) 
    {
        using(Bitmap bmp = new Bitmap(250, 50))
        using(Graphics g = Graphics.FromImage(bmp))
        {
            g.FillRectangle(Brushes.Blue, 0, 0, 250, 50);
            using(Font f = new Font("MS ゴシック", 20))
            {
                string str = DateTime.Now.ToString("yyyy/MM/dd HH:mm");
                g.DrawString(str, f, Brushes.Yellow, 10, 10);
            }
            Response.ContentType = "image/JPEG";
            bmp.Save(Response.OutputStream,ImageFormat.Jpeg);
        }
    }
    </script>
    
    -------------------------------------------------------
    これだけで青い背景に黄色い文字で年月日、時間が記述された画像が表示されます。
    この画像を利用するページでは、imgタグのsrc属性にMyImage.aspxを指定してあげればOKです。

    上記のサンプルではDisposeが必要なオブジェクトについてはusingステートメントを利用して後処理を簡単にしています。
    usingステートメントについてはこちらを参考にしてみてください。

    とりあえず上記の方法で問題はないのですが、画像を生成するような場合、いろいろな機能を含んでいるPageクラスを利用するだけの必要性はないとも言えます。
    こんなとき、できるだけ軽くするためにはIHttpHandlerだけを継承したクラスを.ashxファイルとして作成して利用することができます。

    MyImage.ashx
    -------------------------------------------------------
    <%@ WebHandler language="C#" class="MyImage" %>
    
    using System;
    using System.Web;
    using System.Drawing;
    using System.Drawing.Imaging;
    
    public class MyImage:IHttpHandler
    {
        public bool IsReusable
        {
            get
            {
                return(true);
            }
        }
    
        public void ProcessRequest(HttpContext context)
        {
            using(Bitmap bmp = new Bitmap(250, 50))
            using(Graphics g = Graphics.FromImage(bmp))
            {
                g.FillRectangle(Brushes.Blue, 0, 0, 250, 50);
                using(Font f = new Font("MS ゴシック", 20))
                {
                    string str = DateTime.Now.ToString("yyyy/MM/dd HH:mm");
                    g.DrawString(str, f, Brushes.Yellow, 10, 10);
                }
                context.Response.ContentType = "image/JPEG";
                bmp.Save(context.Response.OutputStream,ImageFormat.Jpeg);
            }
        }
    }
    
    -------------------------------------------------------

    .ashxファイルの中ではIsReusableメソッドとProcessRequestメソッドを実装する必要があります。
    IsReusableメソッドはこのインスタンスを再利用できるようにするかどうかを返すものなので、通常上記のとおりtrueを返しておけばよいでしょう。
    ProcessRequestメソッドには実際の処理を記述します。
    引数としてわたされるHttpContextオブジェクトから現在のRequestやResponseオブジェクトにアクセスできるので、難しいことは特にないですね。

    あおい情報システム株式会社
     小野修司(どっとねっとふぁん)
RSS ニュースフィードで参照
SkinName:iroha_CS2
Powered by Community Server, by Telligent Systems