VB.NET Изменить растровое изображение в вызове функции - PullRequest
0 голосов
/ 18 ноября 2018

Я пытаюсь изменить растровое изображение в вызове функции. Без вызова функции я могу обойтись

'MyBitMap - an existing bitmap of what I want to modify

Using NewBitMap as BitMap = MyBitMap.Clone          'make copy
  Dim G as Graphics = Graphics.FromImage(MyBitMap)  'Draw graphics to MyBitMap
  G.Clear(color.white)                              'Clear image
  G.DrawImage(NewBitMap, -10, 0)                    'Shift Image to left 10
  PictureBox1.Image = MyBitMap
End Using

отлично работает без переполнения памяти или чего-либо еще В сабе работает нормально

Sub BMScroll_S(BM as BitMap, dx as integer, dy as integer)
  using BMtemp as BitMap = BM.Clone
    Dim G as Graphics = Graphics.FromImage(BM)
    G.Clear(color.white)
    G.DrawImage(BMTemp, dx, dy)
  End Using
End Sub

Call BMScroll_S(MyBitMap, -10, 0)
PictureBox1.Image = MyBitMap

работает нормально, но если я пытаюсь создать функцию, возвращающую растровое изображение

Function BMScroll_F(BM as BitMap, dx as integer, dy as integer) as Bitmap
 BMScroll_F = New Bitmap(BM)
 Using BMtemp As Bitmap = BM.Clone
  Dim G As Graphics = Graphics.FromImage(BMScroll_F)
  G.Clear(Color.White)
  G.DrawImage(BMtemp, dx, dy)
  BM.Dispose()
 End Using
End Function

MyBitMap=BMScroll_F(MyBitMap, -10, 0)
PictureBox1.Image = MyBitMap

здесь у меня есть утечка памяти, и после все большего количества итераций она вылетает.

Я предполагаю, что при вызове функции вы возвращаете растровое изображение, а также тот факт, что битовые карты передаются ByRef, поэтому они будут продолжать существовать. Я думал, что BM.Dispose может избавиться от этого - но это не так. Я не совсем уверен, как решить мою утечку памяти (если это на самом деле из-за моего предположения). Конечно, я мог бы продолжить с подпрограммой, но я хотел бы знать, как решить эту проблему в любом случае. Любая помощь будет оценена.

...