Photo Collage: Как уменьшить потребление памяти? - PullRequest
0 голосов
/ 22 июля 2010

Я работаю в программе просмотра изображений 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? Любые мысли будут оценены! Заранее спасибо.

Кстати, я знаю, что потребление памяти увеличится на количество изображений, поэтому планируется ограничить количество изображений на холсте и удалить самое старое изображение при добавлении другого. Но сначала я должен выяснить, какое максимальное и максимальное количество изображений я могу отобразить на холсте.

1 Ответ

1 голос
/ 22 июля 2010

Хотя изображения, которые вы загружаете во время тестирования, имеют размер 2 МБ, я ожидаю, что это размер файла 2 МБ, и представление этих файлов в памяти, вероятно, во много раз превышает этот объем.Если вы берете файлы размером, например, 1000x1000 и изменяете их размер до 200x200, я не вижу необходимости сохранять большее представление в памяти - поэтому я бы сказал, что вы лучше всего можете изменять размеры самих объектов BitmapImage, а не иметьОбъекты изображения масштабируют их при рендеринге (в настоящее время полноразмерные объекты BitmapImage по-прежнему будут в памяти, поскольку они присоединены к Image.Source).

Если у вас есть пути к изображениям, хранящиеся где-то, вы всегда можетеперезагрузите полноразмерные изображения позже, если размер измененного размера изменится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...