いきなり、今日からVB.NETをやることになりました。
急いでいまして、助けて頂きたいです。
では、本題に入ります。
navigate("URL")でWebBrowserに表示した内容を.jpgに保存したいのですが、どのようにすればいいでしょうか?
思いついただけなので、案として捕らえてください
1:ALT+PrintScreenを送ってみる(むしろ自分でキーを押した方がはやい気もする)
2:クリップボードから画像を拾ってjpeg保存
通ってみたさん、ありがとうございます。
自分でキーを押してやるのは簡単なのですが、私はWEBカメラからの画像を短時間間隔で自動的に、.jpegに保存して、その.jpegの画像解析をしようと考えています。
マイクロソフトのサポートオンライン(http://support.microsoft.com/default.aspx?scid=kb;ja;161299)に書いてあることをVB.NETでやりたいです。
何とかいけそうな気がしてきました。また、分からないことがあれば、質問します。
.NETにはpaintPictureが無いのですが、どのようにしたら、pictureBoxの画像の必要な部分を切り取ることができますでしょうか?
下記のようにすると、保存された画像は元の画像の大きさのままになっており、余った部分は真っ黒になります。どのようにすればいいでしょうか?
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
前にやったことは参考になりませんか・・・
>>通ってみたさん
申し訳ありません。よく分かりません。VB.6.0でのpaintPictureに変わるVB.Netのメソッドはあるのでしょうか?
BitbltというAPIを使えばよいかと
※前にも言ったけど
昔こんなの作りました…
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200508/05080128.txt
前に述べた方法で必要な部分を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
え、えっ?ええ・・え?!
…な、何が質問者を頑なに面倒な方向へと…?
VB.NetでのBitBltの使い方を教えてもらえないでしょうか?
Bitbltは画像を扱う上で普通に使われるAPIなので、探せば説明もサンプルもドカッとみつかると思いますが
探しましたか?
>>通ってみたさん
探しました。でも、分かりませんでした。
下記のようにすると、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)
>どこがおかしいでしょうか?
> 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
ツイート | ![]() |