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

解決


土佐犬  2005-09-16 18:07:31  No: 92280  IP: [192.*.*.*]

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

編集 削除
通ってみた  2005-09-16 20:47:58  No: 92281  IP: [192.*.*.*]

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

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

編集 削除
土佐犬  2005-09-17 14:29:01  No: 92282  IP: [192.*.*.*]

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

編集 削除
土佐犬  2005-09-17 16:23:38  No: 92283  IP: [192.*.*.*]

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

編集 削除
土佐犬  2005-09-17 18:30:22  No: 92284  IP: [192.*.*.*]

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

編集 削除
土佐犬  2005-09-17 19:18:59  No: 92285  IP: [192.*.*.*]

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

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-17 20:50:59  No: 92286  IP: [192.*.*.*]

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

編集 削除
土佐犬  2005-09-17 22:03:37  No: 92287  IP: [192.*.*.*]

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

編集 削除
通ってみた  2005-09-17 23:31:31  No: 92288  IP: [192.*.*.*]

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

※前にも言ったけど

編集 削除
ガッ  2005-09-18 01:41:52  No: 92289  IP: [192.*.*.*]

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

編集 削除
土佐犬  2005-09-18 12:51:47  No: 92290  IP: [192.*.*.*]

前に述べた方法で必要な部分を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 14:09:53  No: 92291  IP: [192.*.*.*]

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

編集 削除
土佐犬  2005-09-18 14:20:15  No: 92292  IP: [192.*.*.*]

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

編集 削除
通ってみた  2005-09-18 15:18:54  No: 92293  IP: [192.*.*.*]

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

探しましたか?

編集 削除
土佐犬  2005-09-18 15:30:48  No: 92294  IP: [192.*.*.*]

>>通ってみたさん
探しました。でも、分かりませんでした。
下記のようにすると、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-18 21:23:21  No: 92295  IP: [192.*.*.*]

>どこがおかしいでしょうか?
> 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

編集 削除