Я искренне сомневаюсь, что исключение памяти исходит от вызова Freeze (), поскольку это действительно не выделяет память.
Я почти уверен, что у вас есть утечка GDI ... Вы должнывызовите DeleteObject для растрового изображения, которое вы создаете после вызова CreateBitmapSourceFromHBitmap () ... но поскольку вы вызываете GetHbitmap () в качестве параметра, у вас нет дескриптора для удаления.
Попробуйте это:
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr hObject);
...
IntPtr hObject = b.GetHbitmap();
bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
hObject,
IntPtr.Zero,
Int32Rect.Empty,
options);
DeleteObject(hObject);
Хенк прав, вы не должны форсировать коллекцию GC ... это на самом деле не помогает вам, потому что вы все равно не освобождаете что-либо, что нужно собрать (единственное, что вы освобождаете - это очищать с помощью DeleteObject().
О скольких изображениях 1378x2000 мы говорим? Даже если вы исправите утечку GDI, это большие картинки, которые быстро поглотят память.Разморозить, вы должны клонировать ... но вы будете выделять память, когда будете делать это. Просто чтобы предупредить вас.
Полагаю, что запуск под 64-битной версией невозможен ...