4

ボタンをクリックしたときにユーザー画面の完全なスクリーンショットを撮る機能をプログラムに追加しようとしています。スクリーンショットを撮り、ファイルダイアログボックスを開いて保存するプログラムを取得しました。保存は機能します。問題は、スクリーンショットをどのように保存しても、保存された画像の品質が大幅に低下し、テキストなどの周りがピクセル化することです。ユーザーの画面に表示されているとおりに画像を保存する必要があるため、これは大きな問題です。品質の低下はまったくありません。画像をjpgとpngとして保存しようとしましたが、どちらも品質が低下しました。ユーザーの画面と同じ品質でスクリーンショットを保存できるようにするコードまたは方法を誰かに教えてもらえないかと思っていました。可能であれば、画像をJPGまたはPNGとして保存したいと思います。どんな助けでも大歓迎です!

4

5 に答える 5

6

画像をビットマップ形式で取得し、bmp として保存します。

Private Function TakeScreenShot() 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)

    Dim g As Graphics = Graphics.FromImage(screenGrab)

    g.CopyFromScreen(New Point(0, 0), New Point(0, 0), screenSize)

    Return screenGrab

End Function
于 2012-06-07T11:10:28.903 に答える
3

手始めに、JPEG画像は不可逆圧縮アルゴリズムを使用しているため、その形式で保存すると品質が低下する傾向があります。非圧縮のビットマップ(BMP)、または可逆圧縮を使用するPNGとして保存することをお勧めします。

画面の作業領域をPNG画像にコピーするコードは次のとおりです。

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    'the working area excludes all docked toolbars like taskbar, etc.
    Dim currentScreen = Screen.FromHandle(Me.Handle).WorkingArea

    'create a bitmap of the working area
    Using bmp As New Bitmap(currentScreen.Width, currentScreen.Height)

        'copy the screen to the image
        Using g = Graphics.FromImage(bmp)
            g.CopyFromScreen(New Point(0, 0), New Point(0, 0), currentScreen.Size)
        End Using

        'save the image
        Using sfd As New SaveFileDialog() With {.Filter = "PNG Image|*.png",
                                                .InitialDirectory = My.Computer.FileSystem.SpecialDirectories.Desktop}

            If sfd.ShowDialog() = Windows.Forms.DialogResult.OK Then
                bmp.Save(sfd.FileName, System.Drawing.Imaging.ImageFormat.Png)
            End If
        End Using
    End Using
End Sub
于 2012-06-07T13:34:31.430 に答える
1

.Net は通常、ファイルを 96dpi で保存するため、次のコードを使用すると、ファイルをより高い解像度で Jpeg またはその他の形式で保存できます。

'Create a new bitmap
Using Bmp As New Bitmap(800, 1000, Imaging.PixelFormat.Format32bppPArgb)
'Set the resolution to 300 DPI
    Bmp.SetResolution(300, 300)
'Create a graphics object from the bitmap
    Using G = Graphics.FromImage(Bmp)
'Paint the canvas white
        G.Clear(Color.White)
'Set various modes to higher quality
        G.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
        G.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
        G.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias

'Create a font
        Using F As New Font("Arial", 12)
'Create a brush
            Using B As New SolidBrush(Color.Black)
'Draw some text
                G.DrawString("Hello world", F, B, 20, 20)
            End Using
        End Using
    End Using

'Save the file as a TIFF
    Bmp.Save("c:\\test.Jpeg", Imaging.ImageFormat.Jpeg)
End Using
于 2012-06-07T11:32:45.907 に答える
1

上記のコードに 3 行を追加すると、画像の品質が大幅に向上することがわかりました。

var graphics = Graphics.FromImage(theRequestedAllocatedImage);

graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode = SmoothingMode.HighQuality;


// Then call
graphics.CopyFromScreen(..)
于 2013-01-02T14:20:17.290 に答える