【问题标题】:Save image from picturebox - VB从图片框中保存图像 - VB
【发布时间】:2014-07-27 17:20:46
【问题描述】:

我试图结合两个代码(button2 和 button3)。我希望在单击 Button2 时从图片框 1 中压缩图像(按钮 3 代码)并在没有对话框的情况下保存,无需询问即可保存。这是代码(button2代码有效,但给出对话框,button3给出错误)。

错误: System.Drawing.dll 中出现“System.ArgumentException”类型的未处理异常 附加信息:参数无效。 LINE: Dim bmp1 As New Bitmap("c:\TestPhoto.jpg")

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim bounds As Rectangle
    Dim screenshot As System.Drawing.Bitmap
    Dim graph As Graphics
    bounds = Screen.PrimaryScreen.Bounds
    screenshot = New System.Drawing.Bitmap(bounds.Width, bounds.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
    graph = Graphics.FromImage(screenshot)
    graph.CopyFromScreen(bounds.X, bounds.Y, 0, 0, bounds.Size, CopyPixelOperation.SourceCopy)
    PictureBox1.Image = screenshot
End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Dim savefiledialog1 As New SaveFileDialog
    savefiledialog1.Title = "Save File"
    savefiledialog1.FileName = "*.jpg"
    savefiledialog1.Filter = "Jpeg |*.jpg"
    If savefiledialog1.ShowDialog() = DialogResult.OK Then
        PictureBox1.Image.Save(savefiledialog1.FileName, System.Drawing.Imaging.ImageFormat.Jpeg)
    End If
End Sub


Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    'Private Sub VaryQualityLevel()
    ' Get a bitmap. 
    Dim bmp1 As New Bitmap("c:\TestPhoto.jpg")
    Dim jgpEncoder As ImageCodecInfo = GetEncoder(ImageFormat.Jpeg)
    Dim myEncoder As System.Drawing.Imaging.Encoder = System.Drawing.Imaging.Encoder.Quality
    Dim myEncoderParameters As New EncoderParameters(1)

    Dim myEncoderParameter As New EncoderParameter(myEncoder, 50&)
    myEncoderParameters.Param(0) = myEncoderParameter
    bmp1.Save("c:\TestPhotoQualityFifty.jpg", jgpEncoder, myEncoderParameters)

    myEncoderParameter = New EncoderParameter(myEncoder, 100&)
    myEncoderParameters.Param(0) = myEncoderParameter
    bmp1.Save("c:\TestPhotoQualityHundred.jpg", jgpEncoder, myEncoderParameters)

    ' Save the bitmap as a JPG file with zero quality level compression.
    myEncoderParameter = New EncoderParameter(myEncoder, 0&)
    myEncoderParameters.Param(0) = myEncoderParameter
    bmp1.Save("c:\TestPhotoQualityZero.jpg", jgpEncoder, myEncoderParameters)

End Sub 'VaryQualityLevel

Private Function GetEncoder(ByVal format As ImageFormat) As ImageCodecInfo

    Dim codecs As ImageCodecInfo() = ImageCodecInfo.GetImageDecoders()

    Dim codec As ImageCodecInfo
    For Each codec In codecs
        If codec.FormatID = format.Guid Then
            Return codec
        End If
    Next codec
    Return Nothing

End Function

提前致谢!

【问题讨论】:

  • 关心分享错误是什么和在哪里,或者我们应该猜测?
  • 老兄,不要将其添加为评论 - 将其编辑到您的问题中。
  • ...以及在哪里(哪一行?)
  • (我们知道)确保该文件确实存在,最好将其移动到 C:\Temp 之类的位置...我想我 recognized that code 完成了 jpg/jgp 错字
  • 文件存在,改为临时文件。同样的错误

标签: vb.net screenshot system.drawing


【解决方案1】:

我从您的问题中了解到,在执行 Button_3 下的代码后,您必须通过单击 Button_2 来保存捕获的单击 Button_1 的屏幕截图而不显示对话框。如果是这样--

沿着这条路走…………

首先从您的代码中释放 Button_1 Sub 中的Dim screenshot As System.Drawing.Bitmap 并将其粘贴为文档的通用。

其次复制下面的Sub即可。

Public Sub SaveImage(filename As String, image As Image, Encoder As ImageCodecInfo, EncParam As EncoderParameter)
    Dim path As String = System.IO.Path.Combine(My.Application.Info.DirectoryPath, filename & ".jpg")
    Dim mySource As New Bitmap(image.Width, image.Height)
    Dim grfx As Graphics = Graphics.FromImage(mySource)
    grfx.DrawImageUnscaled(image, Point.Empty)
    grfx.Dispose()
    mySource.Save(filename, System.Drawing.Imaging.ImageFormat.Jpeg)
    mySource.Dispose()
End Sub

第三完全保留Button_2下的代码,将Button_3下的代码剪切粘贴到Button_2下

像这样改变你的代码。

 Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    'Private Sub VaryQualityLevel()
    ' Get a bitmap. 
    Dim bmp1 As New Bitmap(screenshot)
    Dim jgpEncoder As ImageCodecInfo = GetEncoder(ImageFormat.Jpeg)
    Dim myEncoder As System.Drawing.Imaging.Encoder = System.Drawing.Imaging.Encoder.Quality
    Dim myEncoderParameters As New EncoderParameters(1)

    Dim myEncoderParameter As New EncoderParameter(myEncoder, 50&)
    myEncoderParameters.Param(0) = myEncoderParameter
    'your Code....// bmp1.Save("c:\TestPhotoQualityFifty.jpg", jgpEncoder, myEncoderParameters)
    '// Call the above Sub
     SaveImage("C:\Users\User\Desktop\TestPhotoQualityFifty.jpg", bmp1, jgpEncoder, myEncoderParameter)

    myEncoderParameter = New EncoderParameter(myEncoder, 100&)
    myEncoderParameters.Param(0) = myEncoderParameter


    'your Code....// bmp1.Save("c:\TestPhotoQualityFifty.jpg", jgpEncoder, myEncoderParameters)
    '// Call the above Sub
    SaveImage("C:\Users\User\Desktop\TestPhotoQualityFifty.jpg", bmp1, jgpEncoder, myEncoderParameter)

    ' Save the bitmap as a JPG file with zero quality level compression.
    myEncoderParameter = New EncoderParameter(myEncoder, 0&)
    myEncoderParameters.Param(0) = myEncoderParameter


    'your Code....// bmp1.Save("c:\TestPhotoQualityFifty.jpg", jgpEncoder, myEncoderParameters)
    '// Call the above Sub
    SaveImage("C:\Users\User\Desktop\TestPhotoQualityFifty.jpg", bmp1, jgpEncoder, myEncoderParameter)

End Sub 'VaryQualityLevel

剩下的所有代码仍然存在。

现在完成了!

这是示例图片。

【讨论】:

    【解决方案2】:

    在不询问对话框的情况下保存图片框的可见部分...

    只需将以下 Sub 复制粘贴到您的代码中

    Public Sub SaveImage(filename As String, image As Image)
        Dim path As String = System.IO.Path.Combine(My.Application.Info.DirectoryPath, filename & ".jpg")
        Dim mySource As New Bitmap(image.Width, image.Height)
        Dim grfx As Graphics = Graphics.FromImage(mySource)
        grfx.DrawImageUnscaled(image, Point.Empty)
        grfx.Dispose()
        mySource.Save(filename, System.Drawing.Imaging.ImageFormat.Jpeg)
        mySource.Dispose()
    End Sub
    

    然后在Button或其他可执行的地方添加这段代码。

        Dim x As Integer = PictureBox1.Width
        Dim y As Integer = PictureBox1.Height
        Dim bm As New Bitmap(x, y)
        PictureBox1.DrawToBitmap(bm, New Rectangle(0, 0, x, y))
    
        PictureBox1.Image = bm
    
    '// Save The Visible Part of PictureBox Only (.....Cropped.....)
        SaveImage("C:\Users\User\Desktop\1" & ".jpg", bm)
    
    '// Save The image in PictureBox in its Original size.
        SaveImage("C:\Users\User\Desktop\1" & ".jpg", PictureBox1.image)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多