Bilder von Screenshot Dispose´n

  • VB.NET

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

    Bilder von Screenshot Dispose´n

    Hallo liebes Forum,
    ich habe ein Problem mit meinem Fernwartungsprogramm, und zwar steigt der Ram Speicherverbrauch enorm an wenn ich zu viele Screenshots erstelle.
    Dafür gibt es ja die Lösung ein Bild zu dispose´n also

    VB.NET-Quellcode

    1. Image.dispose()

    das Problem ist ich kriege das einfach nicht hin ... ?(
    Ich wäre echt Dankbar wenn mir jemand helfen könnte
    Mein jetziger Sourcecode sieht so aus(funktioniert alles blos eben das Dispose Problem...):

    Screenshot:

    VB.NET-Quellcode

    1. Dim Bitmap As Bitmap
    2. Dim oScreens() As Screen = Screen.AllScreens
    3. Dim nScreenCount As Integer = oScreens.Length
    4. For i As Integer = 0 To nScreenCount - 1
    5. If i = screennumber Then
    6. Dim Rect As Rectangle = oScreens(i).Bounds
    7. Dim Bmp2 As Bitmap = New Bitmap(Rect.Width, Rect.Height)
    8. Using Gra As Graphics = Graphics.FromImage(Bmp2)
    9. Gra.CopyFromScreen(0, 0, 0, 0, Bmp2.Size)
    10. End Using
    11. Bitmap = New Bitmap(Bmp2, 1024, 768)
    12. Bmp2.Dispose()
    13. End If
    14. Next i


    Screenshot wird in 16 Teile geteilt:

    VB.NET-Quellcode

    1. Dim img As Image = Bitmap
    2. Dim sSize As New Size(img.Width / 4, img.Height / 4)
    3. Dim bmp(15) As Bitmap
    4. Dim g As Graphics
    5. For i As Integer = 0 To 15
    6. bmp(i) = New Bitmap(sSize.Width, sSize.Height)
    7. g = Graphics.FromImage(bmp(i))
    8. If i <= 3 Then
    9. g.DrawImage(img, New RectangleF(0, 0, sSize.Width, _
    10. sSize.Height), _
    11. New RectangleF(i * sSize.Width, 0, _
    12. sSize.Width, sSize.Height), GraphicsUnit.Pixel)
    13. ElseIf i <= 7 Then
    14. g.DrawImage(img, New RectangleF(0, 0, sSize.Width, _
    15. sSize.Height), _
    16. New RectangleF((i - 4) * sSize.Width, 1 * _
    17. sSize.Height, sSize.Width, sSize.Height), _
    18. GraphicsUnit.Pixel)
    19. ElseIf i <= 11 Then
    20. g.DrawImage(img, New RectangleF(0, 0, sSize.Width, _
    21. sSize.Height), _
    22. New RectangleF((i - 8) * sSize.Width, 2 * _
    23. sSize.Height, sSize.Width, sSize.Height), _
    24. GraphicsUnit.Pixel)
    25. ElseIf i <= 15 Then
    26. g.DrawImage(img, New RectangleF(0, 0, sSize.Width, _
    27. sSize.Height), _
    28. New RectangleF((i - 12) * sSize.Width, 3 * _
    29. sSize.Height, sSize.Width, sSize.Height), _
    30. GraphicsUnit.Pixel)
    31. End If


    Danach sollen diese Bilder mit alten Bildern verglichen werden, damit es effizienter wird also nur die geänderten Teile des Screenshots gesendet werden.
    Dafür vergleiche ich jedes bitmap in dem Bitmap-Array also

    VB.NET-Quellcode

    1. If bmp(i) = Alterscreenshot(i) Then
    2. 'Senden
    3. Else
    4. 'Nicht Senden
    5. End if


    Nach dieser Schleife muss ich aber alle neuen Bitmaps aus dem Ram kriegen... :D

    Nun endgültige meine Frage wie schaffr ich das...
    ich habe es schon mit

    VB.NET-Quellcode

    1. For each Screenshot as Bitmap in bmp()
    2. Screenshot.dispose
    3. next


    versucht aber das klappt halt nicht... :(
    LG
    Willkommen im Forum. :thumbup:
    Kannst Du vielleicht mal den gesamten Code posten, da lässt sich Dein Effekt leichter nachvollziehen.

    Bohnenstange12 schrieb:

    VB.NET-Quellcode

    1. Dim Bmp2 As Bitmap = New Bitmap(Rect.Width, Rect.Height)
    2. ' ...
    3. Bmp2.Dispose()
    Da kannst Du jedenfalls schon mal ein

    VB.NET-Quellcode

    1. Using Bmp2 As Bitmap = New Bitmap(Rect.Width, Rect.Height)
    2. ' ...
    3. End Using
    draus machen.
    Deine If-Konstruktion:

    VB.NET-Quellcode

    1. For i As Integer = 0 To 15
    2. If i <= 3 Then
    3. ElseIf i <= 7 Then
    4. ElseIf i <= 11 Then
    5. ElseIf i <= 15 Then
    6. End If
    7. Next
    schreib vielleicht so um:

    VB.NET-Quellcode

    1. For i As Integer = 0 To 3
    2. Next
    3. For i As Integer = 4 To 7
    4. Next
    5. For i As Integer = 8 To 11
    6. Next
    7. For i As Integer = 12 To 15
    8. Next
    das ist verständlicher.
    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!

    Ganzer Source

    Der ganze Sourcecode sieht so aus:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Drawing.Imaging
    2. Imports System.Runtime.InteropServices
    3. Imports System.IO
    4. Public Class Form1
    5. Public Function IsEqual(ByVal bmp1 As Bitmap, ByVal bmp2 As Bitmap) As Boolean
    6. Dim equal As Boolean = True
    7. If bmp1 Is Nothing Or bmp2 Is Nothing Then Return False
    8. If Bitmap.ReferenceEquals(bmp1, bmp2) Then Return True
    9. With bmp1
    10. If .Width <> bmp2.Width Then Return False
    11. If .Height <> bmp2.Height Then Return False
    12. If .PixelFormat <> bmp2.PixelFormat Then Return False
    13. End With
    14. Dim rect As New Rectangle(0, 0, bmp1.Width, bmp1.Height)
    15. Dim bd1 As BitmapData = bmp1.LockBits(rect, ImageLockMode.ReadOnly, bmp1.PixelFormat)
    16. Dim bd2 As BitmapData = bmp2.LockBits(rect, ImageLockMode.ReadOnly, bmp2.PixelFormat)
    17. Dim ByteZahl As Integer = bd1.Stride * bd1.Height
    18. Dim bmp1_bytes(ByteZahl - 1), bmp2_bytes(ByteZahl - 1) As Byte
    19. Marshal.Copy(bd1.Scan0, bmp1_bytes, 0, ByteZahl)
    20. Marshal.Copy(bd2.Scan0, bmp2_bytes, 0, ByteZahl)
    21. For i As Integer = 0 To ByteZahl - 1
    22. If bmp1_bytes(i) <> bmp2_bytes(i) Then
    23. equal = False : Exit For
    24. End If
    25. Next i
    26. bmp1.UnlockBits(bd1) : bmp2.UnlockBits(bd2)
    27. Return equal
    28. End Function
    29. Dim Bild0 As Image
    30. Dim Bild1 As Image
    31. Dim Bild2 As Image
    32. Dim Bild3 As Image
    33. Dim Bild4 As Image
    34. Dim Bild5 As Image
    35. Dim Bild6 As Image
    36. Dim Bild7 As Image
    37. Dim Bild8 As Image
    38. Dim Bild9 As Image
    39. Dim Bild10 As Image
    40. Dim Bild11 As Image
    41. Dim Bild12 As Image
    42. Dim Bild13 As Image
    43. Dim Bild14 As Image
    44. Dim Bild15 As Image
    45. Public Sub bilderstellen(ByVal screennumber As Integer)
    46. Dim Bitmap As Bitmap
    47. Dim oScreens() As Screen = Screen.AllScreens
    48. Dim nScreenCount As Integer = oScreens.Length
    49. For i As Integer = 0 To nScreenCount - 1
    50. If i = screennumber Then
    51. Dim Rect As Rectangle = oScreens(i).Bounds
    52. Using Bmp2 As Bitmap = New Bitmap(Rect.Width, Rect.Height)
    53. Using Gra As Graphics = Graphics.FromImage(Bmp2)
    54. Gra.CopyFromScreen(0, 0, 0, 0, Bmp2.Size)
    55. End Using
    56. Bitmap = New Bitmap(Bmp2, 1024, 768)
    57. Bmp2.Dispose()
    58. End Using
    59. End If
    60. Next i
    61. Dim img As Image = Bitmap
    62. Dim sSize As New Size(img.Width / 4, img.Height / 4)
    63. Dim bmp(15) As Bitmap
    64. Dim g As Graphics
    65. For i As Integer = 0 To 15
    66. bmp(i) = New Bitmap(sSize.Width, sSize.Height)
    67. g = Graphics.FromImage(bmp(i))
    68. If i <= 3 Then
    69. g.DrawImage(img, New RectangleF(0, 0, sSize.Width, _
    70. sSize.Height), _
    71. New RectangleF(i * sSize.Width, 0, _
    72. sSize.Width, sSize.Height), GraphicsUnit.Pixel)
    73. ElseIf i <= 7 Then
    74. g.DrawImage(img, New RectangleF(0, 0, sSize.Width, _
    75. sSize.Height), _
    76. New RectangleF((i - 4) * sSize.Width, 1 * _
    77. sSize.Height, sSize.Width, sSize.Height), _
    78. GraphicsUnit.Pixel)
    79. ElseIf i <= 11 Then
    80. g.DrawImage(img, New RectangleF(0, 0, sSize.Width, _
    81. sSize.Height), _
    82. New RectangleF((i - 8) * sSize.Width, 2 * _
    83. sSize.Height, sSize.Width, sSize.Height), _
    84. GraphicsUnit.Pixel)
    85. ElseIf i <= 15 Then
    86. g.DrawImage(img, New RectangleF(0, 0, sSize.Width, _
    87. sSize.Height), _
    88. New RectangleF((i - 12) * sSize.Width, 3 * _
    89. sSize.Height, sSize.Width, sSize.Height), _
    90. GraphicsUnit.Pixel)
    91. End If
    92. If i = 0 Then
    93. If Bild0 Is Nothing Then
    94. Bild0 = bmp(i)
    95. Else
    96. If IsEqual(Bild0, bmp(i)) = True Then
    97. 'nicht senden
    98. Else
    99. sendimage(i, bmp(i))
    100. Bild0.Dispose()
    101. Bild0 = bmp(i)
    102. End If
    103. End If
    104. End If
    105. If i = 1 Then
    106. If Bild1 Is Nothing Then
    107. Bild1 = bmp(i)
    108. Else
    109. If IsEqual(Bild1, bmp(i)) = True Then
    110. 'nicht senden
    111. Else
    112. sendimage(i, bmp(i))
    113. Bild1.Dispose()
    114. Bild1 = bmp(i)
    115. End If
    116. End If
    117. End If
    118. If i = 2 Then
    119. If Bild2 Is Nothing Then
    120. Bild2 = bmp(i)
    121. Else
    122. If IsEqual(Bild2, bmp(i)) = True Then
    123. 'nicht senden
    124. Else
    125. sendimage(i, bmp(i))
    126. Bild2.Dispose()
    127. Bild2 = bmp(i)
    128. End If
    129. End If
    130. End If
    131. If i = 3 Then
    132. If Bild3 Is Nothing Then
    133. Bild3 = bmp(i)
    134. Else
    135. If IsEqual(Bild3, bmp(i)) = True Then
    136. 'nicht senden
    137. Else
    138. sendimage(i, bmp(i))
    139. Bild3.Dispose()
    140. Bild3 = bmp(i)
    141. End If
    142. End If
    143. End If
    144. If i = 4 Then
    145. If Bild4 Is Nothing Then
    146. Bild4 = bmp(i)
    147. Else
    148. If IsEqual(Bild4, bmp(i)) = True Then
    149. 'nicht senden
    150. Else
    151. sendimage(i, bmp(i))
    152. Bild4.Dispose()
    153. Bild4 = bmp(i)
    154. End If
    155. End If
    156. End If
    157. If i = 5 Then
    158. If Bild5 Is Nothing Then
    159. Bild5 = bmp(i)
    160. Else
    161. If IsEqual(Bild5, bmp(i)) = True Then
    162. 'nicht senden
    163. Else
    164. sendimage(i, bmp(i))
    165. Bild5.Dispose()
    166. Bild5 = bmp(i)
    167. End If
    168. End If
    169. End If
    170. If i = 6 Then
    171. If Bild6 Is Nothing Then
    172. Bild6 = bmp(i)
    173. Else
    174. If IsEqual(Bild6, bmp(i)) = True Then
    175. 'nicht senden
    176. Else
    177. sendimage(i, bmp(i))
    178. Bild6.Dispose()
    179. Bild6 = bmp(i)
    180. End If
    181. End If
    182. End If
    183. If i = 7 Then
    184. If Bild7 Is Nothing Then
    185. Bild7 = bmp(i)
    186. Else
    187. If IsEqual(Bild7, bmp(i)) = True Then
    188. 'nicht senden
    189. Else
    190. sendimage(i, bmp(i))
    191. Bild7.Dispose()
    192. Bild7 = bmp(i)
    193. End If
    194. End If
    195. End If
    196. If i = 8 Then
    197. If Bild8 Is Nothing Then
    198. Bild8 = bmp(i)
    199. Else
    200. If IsEqual(Bild8, bmp(i)) = True Then
    201. 'nicht senden
    202. Else
    203. sendimage(i, bmp(i))
    204. Bild8.Dispose()
    205. Bild8 = bmp(i)
    206. End If
    207. End If
    208. End If
    209. If i = 9 Then
    210. If Bild9 Is Nothing Then
    211. Bild9 = bmp(i)
    212. Else
    213. If IsEqual(Bild9, bmp(i)) = True Then
    214. 'nicht senden
    215. Else
    216. sendimage(i, bmp(i))
    217. Bild9.Dispose()
    218. Bild9 = bmp(i)
    219. End If
    220. End If
    221. End If
    222. If i = 10 Then
    223. If Bild10 Is Nothing Then
    224. Bild10 = bmp(i)
    225. Else
    226. If IsEqual(Bild10, bmp(i)) = True Then
    227. 'nicht senden
    228. Else
    229. sendimage(i, bmp(i))
    230. Bild10.Dispose()
    231. Bild10 = bmp(i)
    232. End If
    233. End If
    234. End If
    235. If i = 11 Then
    236. If Bild11 Is Nothing Then
    237. Bild11 = bmp(i)
    238. Else
    239. If IsEqual(Bild11, bmp(i)) = True Then
    240. 'nicht senden
    241. Else
    242. sendimage(i, bmp(i))
    243. Bild11.Dispose()
    244. Bild11 = bmp(i)
    245. End If
    246. End If
    247. End If
    248. If i = 12 Then
    249. If Bild12 Is Nothing Then
    250. Bild12 = bmp(i)
    251. Else
    252. If IsEqual(Bild12, bmp(i)) = True Then
    253. 'nicht senden
    254. Else
    255. sendimage(i, bmp(i))
    256. Bild12.Dispose()
    257. Bild12 = bmp(i)
    258. End If
    259. End If
    260. End If
    261. If i = 13 Then
    262. If Bild13 Is Nothing Then
    263. Bild13 = bmp(i)
    264. Else
    265. If IsEqual(Bild13, bmp(i)) = True Then
    266. 'nicht senden
    267. Else
    268. sendimage(i, bmp(i))
    269. Bild13.Dispose()
    270. Bild13 = bmp(i)
    271. End If
    272. End If
    273. End If
    274. If i = 14 Then
    275. If Bild14 Is Nothing Then
    276. Bild14 = bmp(i)
    277. Else
    278. If IsEqual(Bild14, bmp(i)) = True Then
    279. 'nicht senden
    280. Else
    281. sendimage(i, bmp(i))
    282. Bild14.Dispose()
    283. Bild14 = bmp(i)
    284. End If
    285. End If
    286. End If
    287. If i = 15 Then
    288. If Bild15 Is Nothing Then
    289. Bild15 = bmp(i)
    290. Else
    291. If IsEqual(Bild15, bmp(i)) = True Then
    292. 'nicht senden
    293. Else
    294. sendimage(i, bmp(i))
    295. Bild15.Dispose()
    296. Bild15 = bmp(i)
    297. End If
    298. End If
    299. End If
    300. Next
    301. End Sub
    302. Public Sub sendimage(ByVal number As Integer, ByVal img As Bitmap)
    303. Try
    304. Dim imagetext As String = BitmapToString(img)
    305. 'AnServerSenden("Bildschirmfoto~+~" & imagetext)
    306. Catch ex As Exception
    307. End Try
    308. End Sub
    309. Public Function BitmapToString(ByVal bImage As Image) As String
    310. Try
    311. Dim data As String
    312. Dim ms As MemoryStream = New MemoryStream
    313. bImage.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg)
    314. data = Convert.ToBase64String(ms.ToArray())
    315. Return data
    316. Catch ex As Exception
    317. Return String.Empty
    318. End Try
    319. End Function
    320. End Class


    Ich weiß is relativ scheiße mit den vielen ifs und den 16 einzeln deklarierten Bildern aber mir ist nichts besseres eingefallen ;)
    Auf alle Fälle danke schonmal für die Antworten und ich habe das mit dem Image.FromStream nicht kapiert wie soll ich ein Bitmap in einen Stream laden und was würde die nutzen :?:
    LG

    Bohnenstange12 schrieb:

    Ich weiß is relativ scheiße
    Dann brauche ich das auch nicht kommentieren ;)

    Bohnenstange12 schrieb:

    ich habe das mit dem Image.FromStream nicht kapiert
    Ist auch nicht nötig;)
    Das bring nur was, wenn du aus der Datei liest.
    Insofern war der Tipp eher ungeeignet.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Bohnenstange12 schrieb:

    VB.NET-Quellcode

    1. Dim Bild0 As Image
    Wollen wir mal langsam versuchen, den Code aufzuräumen.
    Pack Deine Bilder in ein Array und greif über den Index zu.

    VB.NET-Quellcode

    1. Dim Bild(15) As Image
    Da sollte Dein Code auf 1 / 3 seiner Länge schmelzen. Mach das und melde Dich dann wieder mit dem neuen Code. :D
    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:

    Da sollte Dein Code auf 1 / 3 seiner Länge schmelzen. Mach das und melde Dich dann wieder mit dem neuen Code. :D

    Ja also neuer überarbeiteter Code sollte soweit auch funktionieren ich glaube ich habe das Ram Problem sogar teilweise gelöst durch

    VB.NET-Quellcode

    1. Bild(i).Dispose()

    Jetzt muss nurnoch das Bmp-Array Disposed werden dann sollte das glaube ich auch passen ... :thumbsup:

    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. Public Sub bilderstellen(ByVal screennumber As Integer)
    27. Dim Bitmap As Bitmap
    28. Dim oScreens() As Screen = Screen.AllScreens
    29. Dim nScreenCount As Integer = oScreens.Length
    30. For i As Integer = 0 To nScreenCount - 1
    31. If i = screennumber Then
    32. Dim Rect As Rectangle = oScreens(i).Bounds
    33. Using Bmp2 As Bitmap = New Bitmap(Rect.Width, Rect.Height)
    34. Using Gra As Graphics = Graphics.FromImage(Bmp2)
    35. Gra.CopyFromScreen(0, 0, 0, 0, Bmp2.Size)
    36. End Using
    37. Bitmap = New Bitmap(Bmp2, 1024, 768)
    38. Bmp2.Dispose()
    39. End Using
    40. End If
    41. Next i
    42. Dim img As Image = Bitmap
    43. Dim sSize As New Size(img.Width / 4, img.Height / 4)
    44. Dim bmp(15) As Bitmap
    45. Dim g As Graphics
    46. For i As Integer = 0 To 15
    47. bmp(i) = New Bitmap(sSize.Width, sSize.Height)
    48. g = Graphics.FromImage(bmp(i))
    49. If i <= 3 Then
    50. g.DrawImage(img, New RectangleF(0, 0, sSize.Width, _
    51. sSize.Height), _
    52. New RectangleF(i * sSize.Width, 0, _
    53. sSize.Width, sSize.Height), GraphicsUnit.Pixel)
    54. ElseIf i <= 7 Then
    55. g.DrawImage(img, New RectangleF(0, 0, sSize.Width, _
    56. sSize.Height), _
    57. New RectangleF((i - 4) * sSize.Width, 1 * _
    58. sSize.Height, sSize.Width, sSize.Height), _
    59. GraphicsUnit.Pixel)
    60. ElseIf i <= 11 Then
    61. g.DrawImage(img, New RectangleF(0, 0, sSize.Width, _
    62. sSize.Height), _
    63. New RectangleF((i - 8) * sSize.Width, 2 * _
    64. sSize.Height, sSize.Width, sSize.Height), _
    65. GraphicsUnit.Pixel)
    66. ElseIf i <= 15 Then
    67. g.DrawImage(img, New RectangleF(0, 0, sSize.Width, _
    68. sSize.Height), _
    69. New RectangleF((i - 12) * sSize.Width, 3 * _
    70. sSize.Height, sSize.Width, sSize.Height), _
    71. GraphicsUnit.Pixel)
    72. End If
    73. If Bild(i) Is Nothing Then
    74. Bild(i) = bmp(i)
    75. Else
    76. If IsEqual(Bild(i), bmp(i)) = True Then
    77. Else
    78. sendimage(i, bmp(i))
    79. Bild(i).Dispose()
    80. Bild(i) = bmp(i)
    81. End If
    82. End If
    83. Next
    84. End Sub

    Bohnenstange12 schrieb:

    VB.NET-Quellcode

    1. For i As Integer = 0 To 15
    Dies machst Du nun wie ich es Dir oben gezeigt habe ...
    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:

    Dies machst Du nun wie ich es Dir oben gezeigt habe ...


    So jez habe ich zwar ne extra Sub drinne funktioniert aber und ist übersichtlicher .... 8o

    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. Public Sub bilderstellen(ByVal screennumber As Integer)
    28. Dim Bitmap As Bitmap
    29. Dim oScreens() As Screen = Screen.AllScreens
    30. Dim nScreenCount As Integer = oScreens.Length
    31. For i As Integer = 0 To nScreenCount - 1
    32. If i = screennumber Then
    33. Dim Rect As Rectangle = oScreens(i).Bounds
    34. Using Bmp2 As Bitmap = New Bitmap(Rect.Width, Rect.Height)
    35. Using Gra As Graphics = Graphics.FromImage(Bmp2)
    36. Gra.CopyFromScreen(0, 0, 0, 0, Bmp2.Size)
    37. End Using
    38. Bitmap = New Bitmap(Bmp2, 1024, 768)
    39. Bmp2.Dispose()
    40. End Using
    41. End If
    42. Next i
    43. Dim img As Image = Bitmap
    44. Dim sSize As New Size(img.Width / 4, img.Height / 4)
    45. Dim g As Graphics
    46. For i As Integer = 0 To 3
    47. bmp(i) = New Bitmap(sSize.Width, sSize.Height)
    48. g = Graphics.FromImage(bmp(i))
    49. g.DrawImage(img, New RectangleF(0, 0, sSize.Width, _
    50. sSize.Height), _
    51. New RectangleF(i * sSize.Width, 0, _
    52. sSize.Width, sSize.Height), GraphicsUnit.Pixel)
    53. vergleichen(i)
    54. Next
    55. For i As Integer = 4 To 7
    56. bmp(i) = New Bitmap(sSize.Width, sSize.Height)
    57. g = Graphics.FromImage(bmp(i))
    58. g.DrawImage(img, New RectangleF(0, 0, sSize.Width, _
    59. sSize.Height), _
    60. New RectangleF((i - 4) * sSize.Width, 1 * _
    61. sSize.Height, sSize.Width, sSize.Height), _
    62. GraphicsUnit.Pixel)
    63. vergleichen(i)
    64. Next
    65. For i As Integer = 8 To 11
    66. bmp(i) = New Bitmap(sSize.Width, sSize.Height)
    67. g = Graphics.FromImage(bmp(i))
    68. g.DrawImage(img, New RectangleF(0, 0, sSize.Width, _
    69. sSize.Height), _
    70. New RectangleF((i - 8) * sSize.Width, 2 * _
    71. sSize.Height, sSize.Width, sSize.Height), _
    72. GraphicsUnit.Pixel)
    73. vergleichen(i)
    74. Next
    75. For i As Integer = 12 To 15
    76. bmp(i) = New Bitmap(sSize.Width, sSize.Height)
    77. g = Graphics.FromImage(bmp(i))
    78. g.DrawImage(img, New RectangleF(0, 0, sSize.Width, _
    79. sSize.Height), _
    80. New RectangleF((i - 12) * sSize.Width, 3 * _
    81. sSize.Height, sSize.Width, sSize.Height), _
    82. GraphicsUnit.Pixel)
    83. vergleichen(i)
    84. Next
    85. End Sub
    86. Public Sub vergleichen(ByVal i As Integer)
    87. If Bild(i) Is Nothing Then
    88. Bild(i) = bmp(i)
    89. Else
    90. If IsEqual(Bild(i), bmp(i)) = True Then
    91. Else
    92. sendimage(i, bmp(i))
    93. Bild(i).Dispose()
    94. Bild(i) = bmp(i)
    95. End If
    96. End If
    97. End Sub


    Es ist ein langer Weg zum perfekten sourcecode :D :D :D

    Bohnenstange12 schrieb:

    Es ist ein langer Weg
    :D

    VB.NET-Quellcode

    1. For i As Integer = 0 To 3
    2. For i As Integer = 4 To 7
    Sieh Dir mal den Inhalt dieser Schleifen an, lagere ihn in eine separate Prozedur aus. :D
    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!
    irgendwann kriegen wir hier noch nen Einzeiler :D

    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: Und, was macht der Speicher?
    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!

    Bohnenstange12 schrieb:

    eigentlich einen guten Verbrauch
    Sicher lässt sich noch das eine oder andere optimieren, aber wenn der Speicherbedarf konstant bleibt, ist es doch erst mal i.O. :D
    Ich hoffe, Du hast nun ein Gefühl dafür bekommen, wie optimiert werden kann. Arbeite mal selbst daran.
    Hilfe bekommst Du hier immer.
    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!