- PR -

描画に関するWebユーザーコントロールについて

投稿者投稿内容
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-11-17 11:46
引用:

Response.ClearContent();
Response.ContentType="image/jpeg";


レスポンスに画像だけを返したいわけではないですよね?

Response に書くのではなくて、Image コントロールは普通に zaseki.jpeg を指しておいて、画像ファイルを更新するだけでいいです。
Response 云々は不必要。

_________________
囚人のジレンマな日々
alf
常連さん
会議室デビュー日: 2005/11/15
投稿数: 22
お住まい・勤務地: 岐阜県・愛知県
投稿日時: 2005-11-18 11:38

囚人さん、レスポンス有難うございます。
あれから下記のようにプログラムを書き直したのですが実行するとSaveの際に、
『GDI+ で一般的なエラーが発生しました。 』
というエラーがどうしても出てしまいます。

過去ログを参考に対象ファイルのアクセス権の設定をフルアクセスに変更
したり、Bitmapに割り当てる際のファイル指定でフルパス指定してみまし
たがどれもダメでした。
(zaseki.jpegはプロジェクトと同じフォルダ配下に存在します)

このエラーが発生する場合、他にどういった理由が考えられるでしょうか?

// ■座席表に対する描画
string image = "zaseki.jpeg";
Bitmap bitmap = new Bitmap(Server.MapPath(image));

Graphics g = Graphics.FromImage(bitmap);
g.SmoothingMode = SmoothingMode.AntiAlias;

g.DrawRectangle(Pens.Red,0,0,400,400);

// Send the bitmap to the output stream
bitmap.Save(Server.MapPath(image), ImageFormat.Jpeg); ←このタイミング
Zaseki.ImageUrl = Server.MapPath(image);

// Cleanup
g.Dispose();
bitmap.Dispose();
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-11-18 12:54
もう少し例外の内容を詳しく書いて頂くと助かるんですが・・・。

Bitmap bitmap = new Bitmap(Server.MapPath(image));
ここで読みこんで、ファイルを閉じずに

bitmap.Save(Server.MapPath(image), ImageFormat.Jpeg);
だからです。

対策としては、一度 FileStream とかに読み出して、Bitmap はそのストリームを読み出して、ストリームを閉じる。そして書く、ですかね。

_________________
囚人のジレンマな日々
alf
常連さん
会議室デビュー日: 2005/11/15
投稿数: 22
お住まい・勤務地: 岐阜県・愛知県
投稿日時: 2005-11-18 15:48

囚人さん、毎回迅速なレスポンス感謝です。
お陰さまで以下のようにFileStreamを用いる事によりImage上に上手く描画すること
ができました。
(スミマセン、前回の質問では言葉足らずでしたがエラーの詳細は
 System.Runtime.InteropServices.ExternalException:
でした。)

・・・
・・・
FileStream fs;
fs = new FileStream(Server.MapPath(image), FileMode.Open, FileAccess.Read);
System.Drawing.Image Img = System.Drawing.Image.FromStream(fs);
fs.Close();

Bitmap bitmap = new Bitmap(Img);
・・・
・・・


ただ、そうなってくると必ず問題になってくるのがn人のクライアント
から同時にサーバーに対してアクセスされた場合や、前回の描画を取り消
して別の矩形を描画したい場合などです。
描画元となる画像ファイルは唯一つしかありませんし、そのファイルに対して
一旦、描画→保存してしまうと次回描画時における前回の取消や他のユーザー
からアクセスされた場合、当然別の画像が生成されなければなりませんがそれ
らの場合一体どうなるのかと思いまして。

ですから、理想的なのはファイルではなくグラフィックオブジェクト(メモリ)
上に必要な情報を毎回全て描画してそれをImageに渡す・・・みたいな感じですが
ASP.NETではそういったことが可能でしょうか?


#別サイトやここの過去ログでも似たような事を質問していた方がみえましたが
 それに対する明確な返答が見当たらなかったので。

todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2005-11-18 16:17
http://www.ailight.jp/ASPGraph_Test.aspx
が「ファイルではなくグラフィックオブジェクト(メモリ) 上に必要な情報を毎回全て描画して」そのImageをレスポンスに渡しているページで、

http://www.ailight.jp/ASPGraph.aspx
がその画像をformに表示しているページです。

囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-11-18 16:18
そうですねぇ。
出来るかどうか試していないので推測ですが。

最初に alf さんが提示されたように aspx のレスポンスに直描したら、ファイルは要らないみたいですね。
なので、今の構成で行くと、ページ(今回できたもの)と画像用(最初に alf さんが用意したもの)の二つの aspx を用意します。
で、ページの Image コントロールは、「画像用のaspx」を指すようにします。(ImaageUrlプロパティは別に aspx でも良いはず)

ファイルに読んだり書いたりしていなから大丈夫かな。

# 追記
# 激しく被った上に、最初に答えが出ていましたね。
# ややこしくしたみたいですみません。
_________________
囚人のジレンマな日々

[ メッセージ編集済み 編集者: 囚人 編集日時 2005-11-18 16:21 ]
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2005-11-18 16:38
以前にも、こんな話題がありました。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=15974&forum=7
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-11-18 19:16
 AI-Light さんところの例を参照したなら、「画面を表示する.aspx」と、「画像を返す.aspx」の2つがあると思うのですが?
 で、「クリッカブルマップ」みたいなので、クリックした座標って、サーバに上がってくるんでしたっけ?上がってくるんだったら、それを「画像を返す.aspx」のリクエストクエリーにしたり、セッションに保存しておくと、クリックした座標を拾えますよね。
 で、画像のみ返せばいいわけですから、Response の内容を画像だけで上書きしてかまわないですよね。


余計混乱するかな?→どっとねっとふぁん 22.サーバ上で画像を生成して表示する
___________________________________________________________________
□ written by Jitta on 2005/11/18
□ Microsoft MVP for Visual Developer ASP/ASP.NET Oct.2005-Sept.2006
_________________

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