Bild (Screenshot) zerteilen + Zusammenfügen

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Bild (Screenshot) zerteilen + Zusammenfügen

    Erstmal Hallo :) ,
    Ich habe vor ein Fernwartungsprogramm zu programmieren und möchte die Bildschirmübertragung optimieren, dafür habe ich mir gedacht damit ich nicht immer einn 1920x1080 Biltmap senden muss zerteile ich dieses in 100 Stücke also den Bildschirm in ein 10x10 Muster und überprüfe in jedem Teil ob sich etwas verändert hat wenn ja wird der neue Teil gesendet. So nun zu meinem Problem ich hatte davor meine sourcecode mit lauter einzelnen Pictureboxen, was natürlich sinnlos ist da man das Bild einfach wieder zusammenfügen kann. Meine Frage also wie zerteile ich ein 1920x1080 Bild in 100 Teile und füge diese später wieder zusammen? Danke schonmal im Vorraus für die Hilfe.


    Den Sourcecode für 16 Teile habe ich berreits aber wie mache ich das mit 100 Teilen und füge das danach wieder zusammen? :?:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Function IsEqual(ByVal bmp1 As Bitmap, ByVal bmp2 As Bitmap) As Boolean
    2. Dim equal As Boolean = True
    3. If bmp1 Is Nothing Or bmp2 Is Nothing Then Return False
    4. If Bitmap.ReferenceEquals(bmp1, bmp2) Then Return True
    5. With bmp1
    6. If .Width <> bmp2.Width Then Return False
    7. If .Height <> bmp2.Height Then Return False
    8. If .PixelFormat <> bmp2.PixelFormat Then Return False
    9. End With
    10. Dim rect As New Rectangle(0, 0, bmp1.Width, bmp1.Height)
    11. Dim bd1 As BitmapData = bmp1.LockBits(rect, ImageLockMode.ReadOnly, bmp1.PixelFormat)
    12. Dim bd2 As BitmapData = bmp2.LockBits(rect, ImageLockMode.ReadOnly, bmp2.PixelFormat)
    13. Dim ByteZahl As Integer = bd1.Stride * bd1.Height
    14. Dim bmp1_bytes(ByteZahl - 1), bmp2_bytes(ByteZahl - 1) As Byte
    15. Marshal.Copy(bd1.Scan0, bmp1_bytes, 0, ByteZahl)
    16. Marshal.Copy(bd2.Scan0, bmp2_bytes, 0, ByteZahl)
    17. For i As Integer = 0 To ByteZahl - 1
    18. If bmp1_bytes(i) <> bmp2_bytes(i) Then
    19. equal = False : Exit For
    20. End If
    21. Next i
    22. bmp1.UnlockBits(bd1) : bmp2.UnlockBits(bd2)
    23. Return equal
    24. End Function
    25. Dim Bild(15) As Image
    26. Dim bmp(15) As Bitmap
    27. Dim sSize As Size
    28. Dim g As Graphics
    29. Dim img As Image
    30. Public Sub bilderstellen(ByVal screennumber As Integer)
    31. Dim Bitmap As Bitmap
    32. Dim oScreens() As Screen = Screen.AllScreens
    33. Dim nScreenCount As Integer = oScreens.Length
    34. For i As Integer = 0 To nScreenCount - 1
    35. If i = screennumber Then
    36. Dim Rect As Rectangle = oScreens(i).Bounds
    37. Using Bmp2 As Bitmap = New Bitmap(Rect.Width, Rect.Height)
    38. Using Gra As Graphics = Graphics.FromImage(Bmp2)
    39. Gra.CopyFromScreen(0, 0, 0, 0, Bmp2.Size)
    40. End Using
    41. Bitmap = New Bitmap(Bmp2, 1024, 768)
    42. Bmp2.Dispose()
    43. End Using
    44. End If
    45. Next i
    46. img = Bitmap
    47. sSize = New Size(img.Width / 4, img.Height / 4)
    48. For i As Integer = 0 To 3
    49. erstellen(i, 0, i)
    50. Next
    51. For i As Integer = 4 To 7
    52. erstellen(i, 1, i - 4)
    53. Next
    54. For i As Integer = 8 To 11
    55. erstellen(i, 2, i - 8)
    56. Next
    57. For i As Integer = 12 To 15
    58. erstellen(i, 3, i - 12)
    59. Next
    60. End Sub
    61. Public Sub erstellen(ByVal i As Integer, ByVal multiplikator As Integer, ByVal widthmultiplikator As Integer)
    62. bmp(i) = New Bitmap(sSize.Width, sSize.Height)
    63. g = Graphics.FromImage(bmp(i))
    64. g.DrawImage(img, New RectangleF(0, 0, sSize.Width, _
    65. sSize.Height), _
    66. New RectangleF((widthmultiplikator) * sSize.Width, multiplikator * _
    67. sSize.Height, sSize.Width, sSize.Height), _
    68. GraphicsUnit.Pixel)
    69. If Bild(i) Is Nothing Then
    70. Bild(i) = bmp(i)
    71. Else
    72. If IsEqual(Bild(i), bmp(i)) = True Then
    73. Else
    74. sendimage(i, bmp(i))
    75. Bild(i).Dispose()
    76. Bild(i) = bmp(i)
    77. End If
    78. End If
    79. End Sub

    Bohnenstange12 schrieb:

    für 16 Teile habe ich berreits
    Aus 4 * 4 mach 10 * 10.
    Ich sehe da absolut kein Problem außer dem, dass Du den von Dir zusammenkopierten Code verstehen musst.
    Das must Du ganz allein machen.
    Iwie kommt mir dieser Cosde bekannt vor.
    Pack zuerst die 4 Schleifen (0-3), (4-7), (8-11), (12-15) in eine übergeorddete Schleife.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Das must Du ganz allein machen.


    Ja habe ich :D und wie füge ich das jez zu einem Bild zusammen? :)

    Spoiler anzeigen

    VB.NET-Quellcode

    1. For i As Integer = 0 To 9
    2. erstellen(i, 0, i)
    3. Next
    4. For i As Integer = 10 To 19
    5. erstellen(i, 1, i - 10)
    6. Next
    7. For i As Integer = 20 To 29
    8. erstellen(i, 2, i - 20)
    9. Next
    10. For i As Integer = 30 To 39
    11. erstellen(i, 3, i - 30)
    12. Next
    13. For i As Integer = 40 To 49
    14. erstellen(i, 4, i - 40)
    15. Next
    16. For i As Integer = 50 To 59
    17. erstellen(i, 5, i - 50)
    18. Next
    19. For i As Integer = 60 To 69
    20. erstellen(i, 6, i - 60)
    21. Next
    22. For i As Integer = 70 To 79
    23. erstellen(i, 7, i - 70)
    24. Next
    25. For i As Integer = 80 To 89
    26. erstellen(i, 8, i - 80)
    27. Next
    28. For i As Integer = 90 To 99
    29. erstellen(i, 9, i - 90)
    30. Next

    Es geht doch nichts über Eigeninitiative :D

    So hab´s schon selbst geschafft der source wird jez nicht perfekt sein falls jemand noch Verbesserungsvorschläge hat bitte schreiben :)

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim img(100) As Image
    2. For i As Integer = 0 To 99
    3. img(i) = Image.FromFile("C:\Pics" & i & ".bmp")
    4. Next
    5. Dim sz As New Size(1920, 1080)
    6. Dim b As New Bitmap(sz.Width, sz.Height)
    7. Dim g As Graphics = Graphics.FromImage(b)
    8. counter = 0
    9. For i As Integer = 0 To 9
    10. g.DrawImage(img(i), img(i).Width * counter, 0)
    11. PictureBox1.Image = b
    12. counter += 1
    13. Next
    14. counter = 0
    15. For i As Integer = 10 To 19
    16. g.DrawImage(img(i), img(i).Width * counter, img(i).Height)
    17. PictureBox1.Image = b
    18. counter += 1
    19. Next
    20. counter = 0
    21. For i As Integer = 20 To 29
    22. g.DrawImage(img(i), img(i).Width * counter, img(i).Height * 2)
    23. PictureBox1.Image = b
    24. counter += 1
    25. Next
    26. counter = 0
    27. For i As Integer = 30 To 39
    28. g.DrawImage(img(i), img(i).Width * counter, img(i).Height * 3)
    29. PictureBox1.Image = b
    30. counter += 1
    31. Next
    32. counter = 0
    33. For i As Integer = 40 To 49
    34. g.DrawImage(img(i), img(i).Width * counter, img(i).Height * 4)
    35. PictureBox1.Image = b
    36. counter += 1
    37. Next
    38. counter = 0
    39. For i As Integer = 50 To 59
    40. g.DrawImage(img(i), img(i).Width * counter, img(i).Height * 5)
    41. PictureBox1.Image = b
    42. counter += 1
    43. Next
    44. counter = 0
    45. For i As Integer = 60 To 69
    46. g.DrawImage(img(i), img(i).Width * counter, img(i).Height * 6)
    47. PictureBox1.Image = b
    48. counter += 1
    49. Next
    50. counter = 0
    51. For i As Integer = 70 To 79
    52. g.DrawImage(img(i), img(i).Width * counter, img(i).Height * 7)
    53. PictureBox1.Image = b
    54. counter += 1
    55. Next
    56. counter = 0
    57. For i As Integer = 80 To 89
    58. g.DrawImage(img(i), img(i).Width * counter, img(i).Height * 8)
    59. PictureBox1.Image = b
    60. counter += 1
    61. Next
    62. counter = 0
    63. For i As Integer = 90 To 99
    64. g.DrawImage(img(i), img(i).Width * counter, img(i).Height * 9)
    65. PictureBox1.Image = b
    66. counter += 1
    67. Next
    Pack zunächst die inzwischen 10 For-Schleifen in eine weitere, dass auis diesen 10 Schleifen eine wird, zusammen also 2 ineinandergeschachtelte Schleifen!
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Pack zunächst die inzwischen 10 For-Schleifen in eine weitere


    Ich habe das mit der schleife nochnich gemacht weil ich in den Ferien war aber ich habe ein Problem beim zusammenfügen und komm echt nicht dahinter was das ist, ich bekomme einen "Argument Exception: Ungültiger Parameter Fehler" ?!? ?(

    Der Fehler kommt in dieser Zeile: Dim g As Graphics = Graphics.FromImage(x)

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Threading
    3. Public Class Form1
    4. Public Sub PicZusammenfügen(ByVal stext As String)
    5. Dim antwortteile() As String = Split(stext, "~+~")
    6. Dim ms As New MemoryStream(Convert.FromBase64String(antwortteile(1)))
    7. Dim bild As Image = Image.FromStream(ms)
    8. Dim i As Integer = antwortteile(0)
    9. Dim x As Image = PictureBox1.Image
    10. Dim g As Graphics = Graphics.FromImage(x)
    11. If i <= 9 Then
    12. g.DrawImage(bild, bild.Width * i, 0)
    13. PictureBox1.Image = x
    14. ElseIf i <= 19 Then
    15. g.DrawImage(bild, bild.Width * (i - 10), bild.Height)
    16. PictureBox1.Image = x
    17. ElseIf i <= 29 Then
    18. g.DrawImage(bild, bild.Width * (i - 20), bild.Height * 2)
    19. PictureBox1.Image = x
    20. ElseIf i <= 39 Then
    21. g.DrawImage(bild, bild.Width * (i - 30), bild.Height * 3)
    22. PictureBox1.Image = x
    23. ElseIf i <= 49 Then
    24. g.DrawImage(bild, bild.Width * (i - 40), bild.Height * 4)
    25. PictureBox1.Image = x
    26. ElseIf i <= 59 Then
    27. g.DrawImage(bild, bild.Width * (i - 50), bild.Height * 5)
    28. PictureBox1.Image = x
    29. ElseIf i <= 69 Then
    30. g.DrawImage(bild, bild.Width * (i - 60), bild.Height * 6)
    31. PictureBox1.Image = x
    32. ElseIf i <= 79 Then
    33. g.DrawImage(bild, bild.Width * (i - 70), bild.Height * 7)
    34. PictureBox1.Image = x
    35. ElseIf i <= 89 Then
    36. g.DrawImage(bild, bild.Width * (i - 80), bild.Height * 8)
    37. PictureBox1.Image = x
    38. ElseIf i <= 99 Then
    39. g.DrawImage(bild, bild.Width * (i - 90), bild.Height * 9)
    40. PictureBox1.Image = x
    41. End If
    42. x.Dispose()
    43. End Sub
    44. Public Function BitmapToString(ByVal bImage As Bitmap) As String
    45. Try
    46. Dim data As String
    47. Dim ms As MemoryStream = New MemoryStream
    48. bImage.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg)
    49. data = Convert.ToBase64String(ms.ToArray())
    50. Return data
    51. Catch ex As Exception
    52. Return String.Empty
    53. End Try
    54. End Function
    55. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    56. Dim t As New Thread(AddressOf add)
    57. t.IsBackground = True
    58. t.Start()
    59. End Sub
    60. Public Sub add()
    61. For i As Integer = 0 To 99
    62. PicZusammenfügen(i & "~+~" & BitmapToString(Image.FromFile("C:\Users\Admin\Desktop\1.jpg")))
    63. Next
    64. End Sub
    65. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    66. PictureBox1.Image = New Bitmap(1920, 1080)
    67. End Sub
    68. End Class


    Hoffe ihr könnt mir helfen :)


    Edit:
    so wenn ich das x.dispose in der letzten Zeile entferne kommt der Fehler hier:
    Das Objekt wird bereits an anderer Stelle verwendet.

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

    Bohnenstange12 schrieb:

    auch jez mit der If Abfrage
    ...

    VB.NET-Quellcode

    1. If i <= 9 Then
    2. g.DrawImage(bild, bild.Width * i, 0)
    3. PictureBox1.Image = x
    4. ElseIf i <= 19 Then
    5. g.DrawImage(bild, bild.Width * (i - 10), bild.Height)
    6. PictureBox1.Image = x
    7. ' ...
    8. ElseIf i <= 89 Then
    9. g.DrawImage(bild, bild.Width * (i - 80), bild.Height * 8)
    10. PictureBox1.Image = x
    11. ElseIf i <= 99 Then
    12. g.DrawImage(bild, bild.Width * (i - 90), bild.Height * 9)
    13. PictureBox1.Image = x
    14. End If

    Suboptimal. ;(
    PictureBox1.Image = x kommt überall vor, kannst Du also raus machen.
    Machma zwischendurch eine Ausgabe MessageBox.Show((i \ 10).ToString). Vielleicht fällt Dir da was auf.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!