首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >截图代码创建模糊截图

截图代码创建模糊截图
EN

Stack Overflow用户
提问于 2013-01-07 02:55:21
回答 1查看 466关注 0票数 1

我一直在我的程序中使用图像识别,并一直认为这是我应用程序中实际图像识别代码的一个问题。在深入研究之后,我意识到我用来创建屏幕截图的代码,包括全屏和屏幕的部分矩形,都是在创建模糊图像。图像很模糊,出来的时候像素化了。

我通常不会保存图像,我只是使用内存中的位图来检查图像识别。尽管在以多种格式保存这些屏幕截图后,我可以看到问题所在。

下面是我用来生成截图的代码。第一个函数创建一个完整的屏幕截图,第二个函数根据屏幕上的坐标创建一个屏幕截图。

代码语言:javascript
复制
   Public Shared Function GetScreen() As Bitmap
    Dim screenSize As Size = New Size(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Height)
    Dim screenGrab As New Bitmap(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Height)
    Using g As Graphics = Graphics.FromImage(screenGrab)
        g.CopyFromScreen(New Point(0, 0), New Point(0, 0), screenSize)
        Return screenGrab
    End Using
End Function

  Public Shared Function 
    GetScreenXY(TopLeft As Point, BottomRight As Point) As Bitmap
    Dim w As Integer = BottomRight.X - TopLeft.X
    Dim h As Integer = BottomRight.Y - TopLeft.Y
    Dim screenGrab As New Bitmap(w, h)   'width and height of the rectangle you want to grab
    Using g As Graphics = Graphics.FromImage(screenGrab)
        g.CopyFromScreen(TopLeft, New Point(0, 0), screenGrab.Size)
        Return screenGrab
    End Using
End Function

我也有一个截图工具在我的应用程序中,我最近添加。它有一个可以调整大小的表单,它可以截取屏幕截图并保存。这些结果也是模糊的。它使用第二个函数。

代码语言:javascript
复制
        Visible = False
        Dim screenShot As Bitmap = ImageFinder.GetScreenXY(New Point(Left, Top), New Point(Right, Bottom))
        Dim sfd As New SaveFileDialog
        sfd.Filter = "Jpeg image (*.jpg)|*.jpg|Bitmap image (*.bmp)|*.bmp| PNG image (*.png)|*.png"
        sfd.Title = "Save image"
        If sfd.ShowDialog() = DialogResult.OK Then
            If sfd.FileName <> String.Empty Then
                'Set to Jpeg by default.
                Dim MyImageFormat As System.Drawing.Imaging.ImageFormat = System.Drawing.Imaging.ImageFormat.Jpeg
                If sfd.FileName.ToString.ToUpper.EndsWith("JPG") Then
                    MyImageFormat = System.Drawing.Imaging.ImageFormat.Jpeg
                ElseIf sfd.FileName.ToString.ToUpper.EndsWith("BMP") Then
                    MyImageFormat = System.Drawing.Imaging.ImageFormat.Bmp
                ElseIf sfd.FileName.ToString.ToUpper.EndsWith("PNG") Then
                    MyImageFormat = System.Drawing.Imaging.ImageFormat.Png
                End If
                screenShot.Save(sfd.FileName, MyImageFormat)
EN

回答 1

Stack Overflow用户

发布于 2013-01-07 14:32:11

这是我的截图方法,拍得很好,我想和大家分享一下。

代码语言:javascript
复制
    'Declare my constants here for screenshots'
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer)
Private Const VK_SNAPSHOT As Short = &H2CS

'Create my function to take the picture of the screen'
Public Function SaveScreen(ByVal theFile As String) As Boolean
    Try
        Dim data As IDataObject
        data = Clipboard.GetDataObject()
        Dim bmap As Bitmap
        If data.GetDataPresent(GetType(System.Drawing.Bitmap)) Then
            bmap = CType(data.GetData(GetType(System.Drawing.Bitmap)), Bitmap)
            Me.picScreen.Image = bmap
            Me.picScreen.Image.Save(theFile, Imaging.ImageFormat.Jpeg)
        End If
    Catch s As Exception
    End Try
End Function

现在让我们保存这张图片。

代码语言:javascript
复制
    Private Sub btnSavePic_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSavePic.Click
    Try

            Call keybd_event(System.Windows.Forms.Keys.Snapshot, 0, 0, 0)
            System.Threading.Thread.Sleep(200) ' To have time to catch the clipboard
            SaveScreen("YOURFILELOCATION" & Format(Now, "MM-dd-yyyy ") & " " & Format(TimeOfDay, "hhmmss") & ".bmp")

    Catch w As Exception
    End Try
End Sub

试一试,当我不在的时候,我用这个向我报告我的屏幕……

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14185579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档