我正在使用照片拼贴模式处理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我知道内存消耗量会增加图像数量,因此计划限制画布中的图像数量,并在添加另一个图像时删除最旧的图像。但首先我必须弄清楚我可以在画布上显示的最佳和最大数量的图像。
答案 0 :(得分:1)
虽然您在测试期间加载的图像大小为2MB,但我希望这是2MB文件大小,并且这些文件的内存中表示可能是此数量的许多倍。如果您正在处理例如1000x1000并将这些大小调整为200x200,我认为没有必要将更大的表示保留在内存中 - 所以我会说你最好调整BitmapImage对象本身的大小,而不是让Image对象在渲染时缩放它们(目前,完整大小的BitmapImage对象仍将在内存中,因为它们附加到Image.Source上。
如果您将图像路径存储在某处,则可以随时重新加载完整尺寸的图像,如果调整大小更改的话。