- PR -

画像をブラウザで表示MemoryStreamについて

1
投稿者投稿内容
JETS
会議室デビュー日: 2002/08/09
投稿数: 14
投稿日時: 2002-10-11 17:44
こんばんわ!
現在、ASP.NETで作成(Glaphicオブジェクトを使用)したBitmapオブジェクトをブラウザに表示させているのですが、
どこかのサイトを参考に下記のようなコードを書いてみたところ、
ブラウザに直接表示されず、画像ソフト(PhotoEditer)が立ち上がって、
そこに表示されてしまうのです。
どうすればいいのでしょうか?
作成したBitmapオブジェクトはBitmapObjです

'MemoryStream を作成します。
Dim ms = New MemoryStream()
' MemoryStream(に画像データを保存)
BitmapObj.Save(ms, ImageFormat.Png)
' 全ての内容出力をバッファストリームから削除()
Response.ClearContent()
'HTTP MIME タイプを image/png に設定
Response.ContentType = "image/png"
' MemoryStream(のデータを書き出す)
Response.BinaryWrite(ms.ToArray())

Response.End()

BitmapObj.Dispose()
karajan
ベテラン
会議室デビュー日: 2002/07/05
投稿数: 89
投稿日時: 2002-10-11 20:05
Bitmap bmp = new Bitmap(640,480);
Graphics g = Graphics.FromImage(bmp);
//何か適当に描画処理
Response.ContentType = "image/gif";
bmp.Save(Response.OutputStream, ImageFormat.Gif);

これでいけないでしょうか?

MSDNではIHttpHandlerインターフェースを実装するクラスを独自に書くサンプルが載ってました。
ページ内のimgタグに表示する場合はそっちでやる必要があると思います。

はずしていたらすみません。

JETS
会議室デビュー日: 2002/08/09
投稿数: 14
投稿日時: 2002-10-12 13:41
karajanさん返答ありがとうございました!
先ほど自己解決しましたので、報告します。
まず、空のweb page をつくり、その中で
bmpオブジェクトをつくり、Graphicsでいろいろ描画しました。
その描画はパラメータを渡すと変形します(折れ線グラフなのです)

そして、表示させたいPageにImageコントロールを張ります。
グラフに渡したいデータもこのページでセッション変数に持たせました。
あとは、ImageコントロールのImageURLに
先ほどグラフを描画したページのURL(./sample.aspx)を記入してやりました。
かなり悩みましたが、自分にはこの方法があってそう(汗
他に方法があれば、情報をお待ちしております。
karajan
ベテラン
会議室デビュー日: 2002/07/05
投稿数: 89
投稿日時: 2002-10-12 18:26
WebFormページ(.aspx)も当然IHttpHandlerを実装してるんで
<img src="MyImage.aspx"> でいいと思います。

ただ、単にレスポンスのストリームに画像を流すためなら、そのために必要でない機能を多く持ってるWebFormクラスで実装するよりはIHttpHandlerを実装したクラスを作ったほうがいいかもしれません。
ファイル名的にもaspxなのに何もHTMLがなかったりすると??てなるかもしれないし・・・。
実際にMachine.Configの構成を見てみると

.aspx -> type="System.Web.UI.PageHandlerFactory"
.ashx -> type="System.Web.UI.SimpleHandlerFactory

となってて拡張子.ashxファイルを用意して捕まえたほうがスマートなような気がします(単純に私の感覚ですが)

実際に書く場合は、インテリセンスを使用したい場合はコードビハインドにする必要があると思います。
MyImage.ashx ファイル
<%@ WebHandler language="C#" Codebehind="MyImage.cs" class="MyImage" %>

MyImage.cs ファイル
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)
{
Bitmap bmp = new Bitmap(640,480);
Graphics g = Graphics.FromImage(bmp);
  //描画処理
context.Response.ContentType = "image/gif";
bmp.Save(context.Response.OutputStream,ImageFormat.Gif);
bmp.Dispose();
g.Dispose();
}
}

MyImage.htmlファイル
<html><head></head><body><img src="MyImage.ashx"></body></html>

ご参考になれば幸いです。
1

スキルアップ/キャリアアップ(JOB@IT)