none
pictureBoxの機能はありますか RRS feed

  • 質問

  • マスターページがあって、決められた場所に描画したいのですが、ASPで下のようにプログラムすると

    マスターページは消えてしまい、新しい画面になって描画してしまいます。

     

    Imports System.Drawing
    Imports System.Drawing.Drawing2D
    Imports System.Drawing.Imaging

     

    Partial Class common_grf
        Inherits System.Web.UI.Page

     

    Protected 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はありません。マスターページも残したままで、決められたボックスの中に描画する方法はあるのでしょうか?

    2007年8月30日 7:07

すべての返信

  • これで本当に描画できるのですか?

    ちょっと信じられませんが。。。

     

    まずはWebとはどういうものか、というところからはじめたほうがいいと思います。

    Webの基本となるのはHTMLです。

    どういうHTMLが作成されると、それがブラウザ上でどのように解釈されてどういった表示になるのか、というところを理解していないとWeb上では何もできませんよ。

     

     

    2007年8月30日 9:20
  • たしかに、あなたの言われるとおり Dim gDraw As Graphics = PictureBox1.CreateGraphics() をHTMLに展開したらどうなるのかと考えると、無理なんでしょうね。

     

    ただ、書いたコードで描画することはたしかです。欠けているコードを継ぎ足しておきました。そのままコピーしてaspxでためしてみれば動くことは確認できると思います。

     

    やり方はちがいますが、一つの方法は、先に描画さておいて、それをイメージファイルとして保存し、指定した場所に置いてあるImageに再度読み込んで表示するという方法もありますね。それか、フレームに分けて別フレームに描画させるという方法もありますね。最初に考えたように、ボックスを指定した場所に置いてそこに描画するというのは無理なんでしょうね。

     

     

    2007年8月30日 11:44
  • 大変興味深かったので、一度試してみましたが、ブラウザには表示されませんでした。

     

    ソース中、「gDraw.DrawLine(pDraw2, 10, 50, 30, 60)」

     

    の「pDraw2」がありませんでしたので、「pDraw」とし、実行しましたがやはり表示されません。出来ればソース丸ごとUp頂ければうれしいです。

     

    ただ、前者の返信内容にもありますようにユーザーコントロールやAjax等の技術を使用しない限り、線を動的にWeb上に表すことはなかなか難しいことだと思われます。

     

    なにせ、最終的に HTML と CSS を主体としたレンダリングエンジン(ie:trident)に依存した絵しかかけないとおもいますので・・・

     

    すみませんが、ソースの件よろしくお願いいたします。

    2007年8月30日 12:15
  • すいません、テストもせずに書きこんでしまって、たしかに動きませんね。

    下のコードはテスト済みです。試してみてください。

     

     

    Imports System.Drawing
    Imports System.Drawing.Drawing2D
    Imports System.Drawing.Imaging


    Partial Class _Default
        Inherits System.Web.UI.Page


    Protected 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 = 2

            Dim 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

    2007年8月30日 13:14
  • 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 Snippet

    Dim imgName As String = "testImg.gif"
    myGraphics.Save(Server.MapPath(imgName), ImageFormat.Gif)
    Image1.ImageUrl = imgName

     

     

    に置き換えます。
    2007年8月30日 14:45
  • 対応いただきありがとうございます。

     

    なるほど画面に描画できますね。個人的にはびっくりです。

    現時点では、発展性は難しいかもしれませんが、Timerかなんらかのイベントと組み合わせると

    面白いかもしれませんね。

     

    正直Webシステムの観点だとshigemin419さんのコードは思いつきませんし、たぶん正しい処理ではないと思いますが・・・

     

    ところで実行すると

    <body>

    <IMG src="http://localhost:3999/aaaa/Default.aspx">

    </body>

    みたいなソースになりますね。

     

     

     

    2007年8月31日 0:20
  • > Webアプリは基本的にはテキストの通信で成り立っています。クライアント側のブラウザでは単にHTMLをダウンロードして

    > 表示させているにすぎません。画像の部分はどちらかというと例外的な部分です。ブラウザがHTMLを解析した後で別に

    > ダウンロードしているのです。

     

     

    その通りですね。クライアント側で描画しているわけではありませんよね。ただ、サーバー側で描画したイメージデータを送っているだけですね。

     

    ところで、私も先に別な方法として書きましたが、あたなも言われているように、Imegeを利用して、当初の目的を達成できました。サーバー側で描画させ、それをimgファイルにして保存し、すぐにまたImageに読み込ませる方法です。

     

    追加コードは次のようになりました。

     

           myGraphics.Save( "App_GData/gData.gif", ImageFormat.Gif)

           Image1.ImageUrl = "~/App_Gdata/gData.gif"

     

    先のコードに、たったこれだけ追加するだけで、指定の位置にマスターページも残したまま、きれいに描画できるようになりました。みなさんいろいろご教授ありがとうございました。


     

    2007年8月31日 0:32
  • 既に解決されているようですが、以下のような記事もありますので、参考になるかもしれません。

     

    [ASP.NET]動的にJPEG画像を作成するには?
    http://www.atmarkit.co.jp/fdotnet/dotnettips/358aspgraph/aspgraph.html

    2007年8月31日 0:43
    モデレータ
  • 解決されているようですので、蛇足となりますが。

     

    最初の投稿には以下の部分の記述がありませんでしたので、絶対に書き出せるはずがない、と思いました。

     

    >    myGraphics.Save(Response.OutputStream, ImageFormat.Gif)

    このようにResponseのストリームにBitmapを保存(というか書き出し)していれば当然その内容が表示されますね。

     

    割と一般的な方法としては、Button1_Clickの中で行っている画像の生成を別のaspxやashxファイルで行うようにして、Image1のURLでその画像を生成しているファイルを指定する、といったやり方があると思います。

    この場合であれば、一時的なファイルの保存は必要なく、画像を生成するファイルのほうでは上記のResponse.OutputStreamへの書き出しをおこなえばよいということになります。

     

    現在の一時的にファイルを保存する方法だと、何人もの人がアクセスしているときにタイミングによっては別の人がつくろうとした画像が表示されてしまう、ということが起きると思います。

    そういった面もよく考えてみることをおすすめします。

    2007年8月31日 1:32
  • コメントありがとうございます。

    あなたが言われるように、私の上記のやり方では、いったんファイルに保存するという点が、欠点だと思っていました。

    メモリー上に置いておくのが理想的ですね。

    そちらについてはまて勉強してみようと思っています。

    このフォーラムのおかげでかなり勉強になりました。

    ありがとうございます。

     

     

     

     

    2007年9月1日 6:28