画面の特定の範囲だけをキャプチャーして保存したいのですがどのようなコードを書けば良いのかまったく解りません、ご指導よろしくお願いします。
とりあえず、クリップボードに貼り付けてPictureBoxに表示する方法は解りました。このあとどうしたら良いのか教えてください。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
SendKeys.SendWait("^{PRTSC}")
Dim d As IDataObject = Clipboard.GetDataObject()
Dim img As Image = CType(d.GetData(DataFormats.Bitmap), Image)
If Not (img Is Nothing) Then
PictureBox1.Image = img
Clipboard.SetDataObject(New DataObject)
End If
>このあとどうしたら良いのか教えてください。
imgの保存方法ってことですかね。
保存だけなら、PictureBox1に入れなくても
If Not (img Is Nothing) Then
img.Save("c:\tes.bmp", System.Drawing.Imaging.ImageFormat.Bmp)
End If
だけで良さそうな気が。
ピクチャーボックスからならこうかな。
PictureBox1.Image.Save("c:\tes.bmp", System.Drawing.Imaging.ImageFormat.Bmp)
誤爆の予感。
ねろさんありがとうございます。
クリップボードからPictureBoxに表示した画像は、保存することができました。保存した画像の一部を切り取ってPictureBoxに表示した場合、
Dim img = New Bitmap("tes.jpg")
Dim g As Graphics = PictureBox1.CreateGraphics()
Dim rect As New Rectangle(10, 10, 100, 100)
g.DrawImage(img, 0, 0, rect, GraphicsUnit.Pixel)
PictureBox1.Image.Save("c:\tes.bmp",System.Drawing.Imaging.ImageFormat.Bmp)
g.Dispose()
この保存方法では保存した画像が真っ黒になってしまいます。
良い方法を教えてください。
その方法はわかりません。orz
BitBltを使った方法は、
'宣言
Private Declare Auto Function BitBlt Lib "gdi32.dll" ( _
ByVal hdcDest As IntPtr, _
ByVal nXDest As Integer, _
ByVal nYDest As Integer, _
ByVal nWidth As Integer, _
ByVal nHeight As Integer, _
ByVal hdcSrc As IntPtr, _
ByVal nXSrc As Integer, _
ByVal nYSrc As Integer, _
ByVal dwRop As System.Int32 _
) As Boolean
Const SRCCOPY As Integer = &HCC0020
'-----------------------------------------------------------
Dim MyGraphics As Graphics = PictureBox1.CreateGraphics
Dim BitImg As New Bitmap(100, 100) ' ビットマップ領域確保
Dim NewBitMap As Graphics = MyGraphics.FromImage(BitImg)
Dim Hdc1 As IntPtr = MyGraphics.GetHdc()
Dim Hdc2 As IntPtr = NewBitMap.GetHdc()
PictureBox1.Image = New Bitmap("c:\test.bmp")
System.Windows.Forms.Application.DoEvents()
BitBlt(Hdc2, 0, 0, 100, 100, Hdc1, 10, 10, SRCCOPY)
MyGraphics.ReleaseHdc(Hdc1)
NewBitMap.ReleaseHdc(Hdc2)
BitImg.Save("c:\test2.bmp", System.Drawing.Imaging.ImageFormat.Bmp)
BitImg.Dispose()
"tes.jpg" では無く"c:\test.bmp"となっていますので注意して下さい。
これ、参考になりませんか?
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200508/05080128.txt
ねろさん、ガッさんありがとうございます。
教えていただいた方法でやってみます。
>その方法はわかりません。orz
簡単だった。
Dim width As Integer = 100
Dim height As Integer = 100
Dim x As Integer = 10
Dim y As Integer = 10
Dim bmp1 As Bitmap = New Bitmap("c:\test.bmp")
Dim bmp2 As Bitmap = New Bitmap(width, height)
Dim gr As Graphics = Graphics.FromImage(bmp2)
gr.DrawImage(bmp1, 0, 0, New Rectangle(x, y, width, height), GraphicsUnit.Pixel)
PictureBox1.Image = bmp2
PictureBox1.Image.Save("c:\test2.bmp", System.Drawing.Imaging.ImageFormat.Bmp)
bmp1.Dispose()
gr.Dispose()
ありがとうございます。解決できました
2番目の方法は
>PictureBox1.Image.Save("c:\test2.bmp", System.Drawing.Imaging.ImageFormat.Bmp)
を
>PictureBox1.Image.Save("c:\test2.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)
に直すとJpegもBmpと同じ画像が得られると思っていましたが、やってみたところ
自動のスケーリングが働いて、違った画像になってしまい、Jegでは使えません。
ごめんなさい。orz
ツイート | ![]() |