VBでクリッピングした画像を保存するには?

解決


vb初心者  2005-09-06 09:54:19  No: 92049

画面の特定の範囲だけをキャプチャーして保存したいのですがどのようなコードを書けば良いのかまったく解りません、ご指導よろしくお願いします。
とりあえず、クリップボードに貼り付けて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


ねろ  2005-09-06 17:03:48  No: 92050

>このあとどうしたら良いのか教えてください。
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)
誤爆の予感。


vb初心者  2005-09-06 17:33:18  No: 92051

ねろさんありがとうございます。
クリップボードから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()
この保存方法では保存した画像が真っ黒になってしまいます。
良い方法を教えてください。


ねろ  2005-09-06 20:59:27  No: 92052

その方法はわかりません。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"となっていますので注意して下さい。


ガッ  2005-09-06 21:14:31  No: 92053

これ、参考になりませんか?
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200508/05080128.txt


vb初心者  2005-09-06 21:34:26  No: 92054

ねろさん、ガッさんありがとうございます。
教えていただいた方法でやってみます。


ねろ  2005-09-07 20:39:30  No: 92055

>その方法はわかりません。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()


vb  2005-09-13 10:17:04  No: 92056

ありがとうございます。解決できました


ねろ  2005-09-19 06:43:50  No: 92057

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


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

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






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