Я работаю в программе просмотра изображений WPF с режимом фотоколлажей. Поэтому некоторые изображения из папки на жестком диске должны отображаться в произвольных положениях на холсте, добавляя изображение после обработки изображений в определенный промежуток времени. Изображения имеют фиксированный целевой размер, к которому их следует масштабировать, но они должны сохранять соотношение сторон.
В настоящее время я тестирую свое приложение с изображениями размером 2 МБ, что довольно быстро увеличивает потребление памяти, так что я получаю исключение вне памяти после примерно 40 изображений на холсте.
Это пример кода, как я загружаю, изменяю размер и добавляю изображения в атм:
void timer_Tick(object sender, EventArgs e)
{
string imagePage = foo.getNextImagePath();
BitmapImage bi = loadImage(imagePath);
int targetWidth = 200;
int targetHeight = 200;
Image img = new Image();
resizeImage(targetWidth, targetHeight, bi.PixelWidth, bi. PixelHeight, img);
img.Source = bi;
// random position
double left = RandomNumber.getRandomDouble(leftMin, leftMax);
double top = RandomNumber.getRandomDouble(topMin, topMax);
Canvas.SetLeft(image, left);
Canvas.SetTop(image, top);
imageCanvas.Children.Add(image);
}
private BitmapImage loadImage(string imagePath)
{
bi = new BitmapImage();
bi.BeginInit();
bi.UriSource = new Uri(imagePath, UriKind.Absolute);
bi.CacheOption = BitmapCacheOption.Cache;
bi.EndInit();
return bi;
}
private void resizeImage(double maxWidth, double maxHeight, double imageWidth, double imageHeight, Image img)
{
double newWidth = maxWidth;
double newHeight = maxHeight;
// calculate new size with keeping aspect ratio
if (imageWidth > imageHeight)
{// landscape format
newHeight = newWidth / imageWidth * imageHeight;
}
else
{// portrait format
newWidth = newHeight / imageHeight * imageWidth;
}
img.Width = newWidth;
img.Height = newHeight;
}
Я хотел бы знать, как я могу уменьшить использование памяти. Возможно изменение размера непосредственно при создании BitmapImage? Любые мысли будут оценены! Заранее спасибо.
Кстати, я знаю, что потребление памяти увеличится на количество изображений, поэтому планируется ограничить количество изображений на холсте и удалить самое старое изображение при добавлении другого. Но сначала я должен выяснить, какое максимальное и максимальное количество изображений я могу отобразить на холсте.