Я хочу показать Bitmap
в контейнере Image
с WPF.Растровая графика CreateBitmapSourceFromHBitmap утечка памяти
private void updateImagePreview()
{
Bitmap bmp = new Bitmap(Screen.PrimaryScreen.WorkingArea.Width,
Screen.PrimaryScreen.WorkingArea.Height);
Graphics gr = Graphics.FromImage(bmp);
Image Image_Preview;
while (true)
{
gr.CopyFromScreen(0, 0, 0, 0, new System.Drawing.Size(bmp.Width, bmp.Height));
Image_Preview.Source = loadBitmap(bmp);
}
}
[DllImport("gdi32")]
static extern int DeleteObject(IntPtr o);
public BitmapSource loadBitmap(System.Drawing.Bitmap source)
{
IntPtr ip = source.GetHbitmap();
BitmapSource bs = null;
try
{
bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
ip, IntPtr.Zero, Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
}
finally
{
DeleteObject(ip);
}
return bs;
}
Проблема в том, что это создает огромную утечку памяти. Утечка происходит по вызову CreateBitmapSourceFromHBitmap
и заполняет память при циклическом перемещении до превышения предела. Если я не использую этот вызов, утечка исчезнет. Любая идея, почему это происходит?
Что вы имеете в виду под «утечкой памяти»? Он хранит ссылки в памяти после того, как он должен был быть уничтожен? Или один вызов заполняет вашу память? – almulo
Он держит ссылки. Один вызов будет работать, но утечка памяти все равно будет. – Flupp
Вы видели [этот точно такой же вопрос] (http://stackoverflow.com/q/28952654/1136211)? У него много ссылок, но ответа нет. – Clemens