照片拼贴:如何减少内存消耗?

时间:2010-07-22 01:01:05

标签: wpf

我正在使用照片拼贴模式处理WPF图像查看器。因此,通过在特定时间间隔内成像后添加图像,应该在画布上的随机位置上显示来自hdd上的文件夹的一些图像。图像具有固定的目标尺寸,它们应缩放到它们,但它们应保持纵横比。

目前我正在使用2 mb图像测试我的应用程序,这样可以非常快速地增加内存消耗,因此在画布上大约40张图像后我会出现异常情况。

这是一些示例代码,我如何加载,调整大小和添加图像atm:

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时调整大小?任何想法将不胜感激!提前谢谢。

BTW我知道内存消耗量会增加图像数量,因此计划限制画布中的图像数量,并在添加另一个图像时删除最旧的图像。但首先我必须弄清楚我可以在画布上显示的最佳和最大数量的图像。

1 个答案:

答案 0 :(得分:1)

虽然您在测试期间加载的图像大小为2MB,但我希望这是2MB文件大小,并且这些文件的内存中表示可能是此数量的许多倍。如果您正在处理例如1000x1000并将这些大小调整为200x200,我认为没有必要将更大的表示保留在内存中 - 所以我会说你最好调整BitmapImage对象本身的大小,而不是让Image对象在渲染时缩放它们(目前,完整大小的BitmapImage对象仍将在内存中,因为它们附加到Image.Source上。

如果您将图像路径存储在某处,则可以随时重新加载完整尺寸的图像,如果调整大小更改的话。