WebBrowserの内容を.jpgに保存するには(.NET)?

解決


土佐犬  2005-09-17 03:07:31  No: 92280

いきなり、今日からVB.NETをやることになりました。
急いでいまして、助けて頂きたいです。
では、本題に入ります。
navigate("URL")でWebBrowserに表示した内容を.jpgに保存したいのですが、どのようにすればいいでしょうか?


通ってみた  2005-09-17 05:47:58  No: 92281

思いついただけなので、案として捕らえてください

1:ALT+PrintScreenを送ってみる(むしろ自分でキーを押した方がはやい気もする)
2:クリップボードから画像を拾ってjpeg保存


土佐犬  2005-09-17 23:29:01  No: 92282

通ってみたさん、ありがとうございます。
自分でキーを押してやるのは簡単なのですが、私はWEBカメラからの画像を短時間間隔で自動的に、.jpegに保存して、その.jpegの画像解析をしようと考えています。
マイクロソフトのサポートオンライン(http://support.microsoft.com/default.aspx?scid=kb;ja;161299)に書いてあることをVB.NETでやりたいです


土佐犬  2005-09-18 01:23:38  No: 92283

何とかいけそうな気がしてきました。また、分からないことがあれば、質問します。


土佐犬  2005-09-18 03:30:22  No: 92284

.NETにはpaintPictureが無いのですが、どのようにしたら、pictureBoxの画像の必要な部分を切り取ることができますでしょうか?


土佐犬  2005-09-18 04:18:59  No: 92285

下記のようにすると、保存された画像は元の画像の大きさのままになっており、余った部分は真っ黒になります。どのようにすればいいでしょうか?

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim bitmap As Bitmap = New Bitmap(PictureBox1.Width, PictureBox1.Height)
        PictureBox1.Image = bitmap
    End Sub

    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        'Bitmapオブジェクトの作成(切り取り元画像の指定)
        Dim bmap = New Bitmap("D:\test.JPG")

        '切り取る範囲をRectanleで指定
        Dim rect As New Rectangle(125, 16, 640, 480)

        'PictureBox1のGraphicsオブジェクトの作成
        Dim g As Graphics = Graphics.FromImage(PictureBox1.Image)

        '元の画像の指定部分を切り取ってPictureboxの左上隅(x,y = 0,0)に表示する.単位はピクセル.
        g.DrawImage(bmap, 0, 0, rect, GraphicsUnit.Pixel)

        PictureBox1.Refresh()

        PictureBox1.Image.Save("testResult.bmp", System.Drawing.Imaging.ImageFormat.Bmp)

        'Graphicsオブジェクトを破棄
        g.Dispose()

    End Sub


通ってみた  2005-09-18 05:50:59  No: 92286

前にやったことは参考になりませんか・・・


土佐犬  2005-09-18 07:03:37  No: 92287

>>通ってみたさん
申し訳ありません。よく分かりません。VB.6.0でのpaintPictureに変わるVB.Netのメソッドはあるのでしょうか?


通ってみた  2005-09-18 08:31:31  No: 92288

BitbltというAPIを使えばよいかと

※前にも言ったけど


ガッ  2005-09-18 10:41:52  No: 92289

昔こんなの作りました…
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200508/05080128.txt


土佐犬  2005-09-18 21:51:47  No: 92290

前に述べた方法で必要な部分をPictureBoxの左上隅に移動させ、新たに必要な部分の大きさのBitMapを作成し書き込むことで解決しました。
いろいろなご意見ありがとうございました。
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim bitmap As Bitmap = New Bitmap(PictureBox1.Width, PictureBox1.Height)
PictureBox1.Image = bitmap
End Sub

Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) _
    Handles Button1.Click
Dim x, y As Integer
Dim myValue As Color            'ビットマップ画素値
Dim myColor As Color            'カラー構造体
Dim v As Long                   'ビットマップ画素値バッファ
Dim bmap1, bmap2 As Bitmap      'ビットマップ構造体

bmap1 = PictureBox1.Image
bmap2 = New Bitmap(640, 480)

For x = 0 To 640 - 1
            For y = 0 To 480 - 1
                myValue = bmap1.GetPixel(x, y)
                v = myValue.ToArgb()
                myColor = Color.FromArgb(v)
                bmap2.SetPixel(x, y, myColor)
            Next
        Next
bmap2.Save("result.jpeg", System.Drawing.Imaging.ImageFormat.Jpeg)
End Sub


ガッ  2005-09-18 23:09:53  No: 92291

え、えっ?ええ・・え?!
…な、何が質問者を頑なに面倒な方向へと…?


土佐犬  2005-09-18 23:20:15  No: 92292

VB.NetでのBitBltの使い方を教えてもらえないでしょうか?


通ってみた  2005-09-19 00:18:54  No: 92293

Bitbltは画像を扱う上で普通に使われるAPIなので、探せば説明もサンプルもドカッとみつかると思いますが

探しましたか?


土佐犬  2005-09-19 00:30:48  No: 92294

>>通ってみたさん
探しました。でも、分かりませんでした。
下記のようにすると、result.JPEGは真っ黒になってしまいます。
どこがおかしいでしょうか?
        Dim disDC As IntPtr = PictureBox1.Handle
        Dim bmp As New Bitmap(640, 480)
        Dim hDC As IntPtr
        'Graphicsの作成
        Dim g As Graphics = Graphics.FromImage(bmp)
        'Graphicsのデバイスコンテキストを取得
        hDC = g.GetHdc()

        BitBlt(hDC, 0, 0, 640, 480, disDC, 0, 0, SRCCOPY)
        bmp.Save("result.JPEG", System.Drawing.Imaging.ImageFormat.Jpeg)


我龍院忠太  2005-09-19 06:23:21  No: 92295

>どこがおかしいでしょうか?
> Dim disDC As IntPtr = PictureBox1.Handle
ピクチャボックスのハンドルではなく、 Graphicsのハンドルでしょ。
Dim MyGraphics As Graphics = PictureBox1.CreateGraphics
Dim disDC As IntPtr = MyGraphics.GetHdc()

それと、PictureBox1にはイメージはセットされてるよね。
もしファイルからの読み込みの場合はDoEvents()を入れます。
PictureBox1.Image = New Bitmap(Application.StartupPath & "\XXXX.jpg")
System.Windows.Forms.Application.DoEvents()

さらにSaveの前にハンドルを開放します。
g.ReleaseHdc(hDC)
bmp.Save("result.JPEG", System.Drawing.Imaging.ImageFormat.Jpeg)

だいたいBitBltの場合は
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200509/05090025.txt
ここに私(ねろ=我龍院忠太)が書いた方法そのままでいけるのでは。
ただし、2番目の方法は、Jpegの場合自動のスケーリングが働いてだめなようです。orz


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加