GDI Error

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Rikudo.

    Hey,

    Also ich habe mir eine Screenshotfunktion geschrieben mit der ich einen Schnapschuss machen kann, sowie die Compression (Qualität) einstellen kann und einen
    Stempel (DrawString) draufklatschen kann.
    Ebenfalls habe ich eine Funktion um ein Bild in einen Hexadecimal String umzuwandeln.

    VB.NET-Quellcode

    1. Private Function Screenshot(Optional ByVal Quality As Integer = 50, Optional ByVal StampString As String = Nothing) As Image
    2. Dim Rect As Rectangle = Screen.PrimaryScreen.Bounds
    3. Dim ImageCodec() As System.Drawing.Imaging.ImageCodecInfo = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders()
    4. Dim EncodeParameters As New System.Drawing.Imaging.EncoderParameters(1)
    5. EncodeParameters.Param(0) = New System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, Quality)
    6. Using MySnapshot As Bitmap = New Bitmap(Rect.Width, Rect.Height), Graphics As Graphics = Graphics.FromImage(MySnapshot)
    7. Graphics.CopyFromScreen(0, 0, 0, 0, MySnapshot.Size)
    8. Dim Stamp As New Font(System.Drawing.FontFamily.GenericSansSerif, 14, FontStyle.Bold, GraphicsUnit.Point)
    9. Graphics.DrawString(StampString, Stamp, Brushes.Red, 6, 6)
    10. Using Ms As New IO.MemoryStream
    11. MySnapshot.Save(Ms, ImageCodec(1), EncodeParameters)
    12. Return Image.FromStream(Ms)
    13. End Using
    14. End Using
    15. End Function
    16. Private Function ImageToHex(ByVal Img As Image) As String
    17. Using Ms As New IO.MemoryStream
    18. Img.Save(Ms, Imaging.ImageFormat.Jpeg)
    19. Return BitConverter.ToString(Ms.ToArray, 0).Replace("-", "")
    20. End Using
    21. End Function


    Beide Funktionen funktionieren getrennt fehlerfrei.
    D.h. Wenn ich ein Bild in einer PictureBox habe, und dann die ImageToHex Funktion nutze gibt er mit den HexString zurück. So Solls sein.
    Wenn ich den Screenshot direct in ne PictureBox klatsche zeigt er ihm mir auch Problemlos an.

    Wenn ich ihn allerdings direkt konvertiere, dann bekomm ich einen seltsamen Fehler.



    Ich habe es so versucht:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim Img As Image = Screenshot(70, "Hallo")
    3. RichTextBox1.Text = ImageToHex(Img)
    4. End Sub


    Woran liegt das?
    Da Imageformat ist egal, hab schon alles probiert (JPEG, PNG, BITMAP etc)
    Das muss doch möglich sein den Screenshot direkt im Speicher in nen HexString zu konvertieren ohne das ich ihn vorher in eine PictureBox laden muss??
    C# Developer
    Learning C++

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Rikudo“ ()

    Nochmal überarbeitet:

    VB.NET-Quellcode

    1. Private Function Screenshot(Optional ByVal Quality As Integer = 50, Optional ByVal StampString As String = Nothing) As Image
    2. Dim Rect As Rectangle = Screen.AllScreens(0).Bounds
    3. Dim ImageCodec() As System.Drawing.Imaging.ImageCodecInfo = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders()
    4. Dim EncodeParameters As New System.Drawing.Imaging.EncoderParameters(1)
    5. Dim NewRect As Rectangle
    6. NewRect = Screen.PrimaryScreen.Bounds
    7. EncodeParameters.Param(0) = New System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, Quality)
    8. Using MySnapshot As Bitmap = New Bitmap(Rect.Width, Rect.Height), Graphics As Graphics = Graphics.FromImage(MySnapshot)
    9. Graphics.CopyFromScreen(0, 0, 0, 0, MySnapshot.Size)
    10. Dim Stamp As New Font(System.Drawing.FontFamily.GenericSansSerif, 14, FontStyle.Bold, GraphicsUnit.Point)
    11. Graphics.DrawString(StampString, Stamp, Brushes.Red, 6, 6)
    12. Using Ms As New IO.MemoryStream
    13. MySnapshot.Save(Ms, ImageCodec(1), EncodeParameters)
    14. Return Image.FromStream(Ms)
    15. End Using
    16. End Using
    17. End Function
    18. Public Function ImageToHex(ByVal NewImage As Bitmap) As String
    19. Dim bmpDataNew As BitmapData = NewImage.LockBits(New Rectangle(0, 0, NewImage.Width, NewImage.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, NewImage.PixelFormat)
    20. Dim HexArr As String = String.Empty
    21. For y As Integer = 0 To bmpDataNew.Height - 1
    22. For x As Integer = 0 To bmpDataNew.Width - 1
    23. Dim hexx As String = Hex(Marshal.ReadInt32(bmpDataNew.Scan0, (bmpDataNew.Stride * y) + x * 4)).ToString(CType("X8", IFormatProvider))
    24. HexArr &= hexx
    25. Next
    26. Next
    27. NewImage.UnlockBits(bmpDataNew)
    28. Return HexArr
    29. End Function
    30. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    31. RichTextBox1.Text = ImageToHex(New Bitmap(Screenshot(10, "1234567890")))
    32. End Sub


    Jetzt bekomm ich allerdings diesen Fehler:



    Keiner ne Idee?
    C# Developer
    Learning C++