質問者
pictureBoxの機能はありますか

質問
-
マスターページがあって、決められた場所に描画したいのですが、ASPで下のようにプログラムすると
マスターページは消えてしまい、新しい画面になって描画してしまいます。
Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports System.Drawing.ImagingPartial Class common_grf
Inherits System.Web.UI.PageProtected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim myBitmap As Bitmap = New Bitmap(500, 500)
Dim gDraw As Graphics = Graphics.FromImage(myBitmap )gDraw.SmoothingMode = SmoothingMode.AntiAlias
gDraw.FillRectangle(New SolidBrush(Color.White), 0, 0, 500, 500)Dim pDraw As Pen
pDraw = New Pen(Color.DimGray)pDraw.Width = 3
gDraw.DrawLine(pDraw2, 10, 50, 30, 60)
pDraw.Dispose()
End Sub
End Class
PictureBoxのようなものがあれば Dim gDraw As Graphics = PictureBox1.CreateGraphics() として、マスターページも残したまま、決められた位置に描画できるのでしょうが、ASPのコンポーネントにはPictureBoxはありません。マスターページも残したままで、決められたボックスの中に描画する方法はあるのでしょうか?
すべての返信
-
たしかに、あなたの言われるとおり Dim gDraw As Graphics = PictureBox1.CreateGraphics() をHTMLに展開したらどうなるのかと考えると、無理なんでしょうね。
ただ、書いたコードで描画することはたしかです。欠けているコードを継ぎ足しておきました。そのままコピーしてaspxでためしてみれば動くことは確認できると思います。
やり方はちがいますが、一つの方法は、先に描画さておいて、それをイメージファイルとして保存し、指定した場所に置いてあるImageに再度読み込んで表示するという方法もありますね。それか、フレームに分けて別フレームに描画させるという方法もありますね。最初に考えたように、ボックスを指定した場所に置いてそこに描画するというのは無理なんでしょうね。
-
大変興味深かったので、一度試してみましたが、ブラウザには表示されませんでした。
ソース中、「gDraw.DrawLine(pDraw2, 10, 50, 30, 60)」
の「pDraw2」がありませんでしたので、「pDraw」とし、実行しましたがやはり表示されません。出来ればソース丸ごとUp頂ければうれしいです。
ただ、前者の返信内容にもありますようにユーザーコントロールやAjax等の技術を使用しない限り、線を動的にWeb上に表すことはなかなか難しいことだと思われます。
なにせ、最終的に HTML と CSS を主体としたレンダリングエンジン(ie:trident)に依存した絵しかかけないとおもいますので・・・
すみませんが、ソースの件よろしくお願いいたします。
-
すいません、テストもせずに書きこんでしまって、たしかに動きませんね。
下のコードはテスト済みです。試してみてください。
Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports System.Drawing.Imaging
Partial Class _Default
Inherits System.Web.UI.PageProtected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim myGraphics As Bitmap = New Bitmap(300, 300)
Dim gDraw As Graphics = Graphics.FromImage(myGraphics)
gDraw.SmoothingMode = SmoothingMode.AntiAlias
gDraw.FillRectangle(New SolidBrush(Color.White), 0, 0, 300, 300)Dim pDraw As Pen
pDraw = New Pen(Color.Blue)
pDraw.Width = 2Dim r1 As Rectangle
r1 = New Rectangle(20, 30, 40, 50)gDraw.DrawEllipse(pDraw, r1)
gDraw.DrawLine(pDraw, 10, 100, 30, 200)
gDraw.DrawRectangle(pDraw, 150, 100, 80, 150)
myGraphics.Save(Response.OutputStream, ImageFormat.Gif)
gDraw.Dispose()End Sub
End Class
-
Webアプリは基本的にはテキストの通信で成り立っています。クライアント側のブラウザでは単にHTMLをダウンロードして表示させているにすぎません。画像の部分はどちらかというと例外的な部分です。ブラウザがHTMLを解析した後で別にダウンロードしているのです。
しようとしていることは普通にImageコントロールではできませんか。
まず画像のストリームはサーバーのローカルにいったん画像ファイルとして保存します。
ImageコントロールはHTMLのimgタグにレンダリングされます。
ですので、
Image コントロール
http://msdn2.microsoft.com/ja-jp/library/system.web.ui.webcontrols.image(VS.80).aspx
の
Image.ImageUrl プロパティ
http://msdn2.microsoft.com/ja-jp/library/system.web.ui.webcontrols.image.imageurl(VS.80).aspx
に画像のUrlを指定します。とりあえず以下を試してみてください。
まずImage コントロールImage1を配置します。
shigemin419 さんからの引用 myGraphics.Save(Response.OutputStream, ImageFormat.Gif)
の部分を
Code SnippetDim imgName As String = "testImg.gif"
myGraphics.Save(Server.MapPath(imgName), ImageFormat.Gif)
Image1.ImageUrl = imgName -
対応いただきありがとうございます。
なるほど画面に描画できますね。個人的にはびっくりです。
現時点では、発展性は難しいかもしれませんが、Timerかなんらかのイベントと組み合わせると
面白いかもしれませんね。
正直Webシステムの観点だとshigemin419さんのコードは思いつきませんし、たぶん正しい処理ではないと思いますが・・・
ところで実行すると
<body>
<IMG src="http://localhost:3999/aaaa/Default.aspx">
</body>
みたいなソースになりますね。
-
> Webアプリは基本的にはテキストの通信で成り立っています。クライアント側のブラウザでは単にHTMLをダウンロードして
> 表示させているにすぎません。画像の部分はどちらかというと例外的な部分です。ブラウザがHTMLを解析した後で別に
> ダウンロードしているのです。
その通りですね。クライアント側で描画しているわけではありませんよね。ただ、サーバー側で描画したイメージデータを送っているだけですね。
ところで、私も先に別な方法として書きましたが、あたなも言われているように、Imegeを利用して、当初の目的を達成できました。サーバー側で描画させ、それをimgファイルにして保存し、すぐにまたImageに読み込ませる方法です。
追加コードは次のようになりました。
myGraphics.Save( "App_GData/gData.gif", ImageFormat.Gif)
Image1.ImageUrl = "~/App_Gdata/gData.gif"
先のコードに、たったこれだけ追加するだけで、指定の位置にマスターページも残したまま、きれいに描画できるようになりました。みなさんいろいろご教授ありがとうございました。
-
既に解決されているようですが、以下のような記事もありますので、参考になるかもしれません。
[ASP.NET]動的にJPEG画像を作成するには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/358aspgraph/aspgraph.html -
解決されているようですので、蛇足となりますが。
最初の投稿には以下の部分の記述がありませんでしたので、絶対に書き出せるはずがない、と思いました。
> myGraphics.Save(Response.OutputStream, ImageFormat.Gif)
このようにResponseのストリームにBitmapを保存(というか書き出し)していれば当然その内容が表示されますね。
割と一般的な方法としては、Button1_Clickの中で行っている画像の生成を別のaspxやashxファイルで行うようにして、Image1のURLでその画像を生成しているファイルを指定する、といったやり方があると思います。
この場合であれば、一時的なファイルの保存は必要なく、画像を生成するファイルのほうでは上記のResponse.OutputStreamへの書き出しをおこなえばよいということになります。
現在の一時的にファイルを保存する方法だと、何人もの人がアクセスしているときにタイミングによっては別の人がつくろうとした画像が表示されてしまう、ということが起きると思います。
そういった面もよく考えてみることをおすすめします。