我有一个非常大的图像(600mb)30000x30000,并希望将其加载到wpf图像控件中。
我可以使用Windows Photo Viewer观看此图像!
我将testapp设置为64位并使用以下代码。
var image = new BitmapImage();
image.BeginInit();
// load into memory and unlock file
image.CacheOption = BitmapCacheOption.OnLoad;
image.UriSource = uri;
image.EndInit();
imagecontrol.source = image;
测试应用程序只显示带有此大图像的白色屏幕。
像100mb和7000x7000这样的小型工作正在发挥作用。
我做错了什么?因为我的英语不好而且提前感谢。
答案 0 :(得分:3)
与32位Windows操作系统一样,在64位Windows操作系统上运行64位托管应用程序时,可以创建的对象大小限制为2GB。
答案 1 :(得分:2)
我将它分成10个(3000x3000)段并将它们分成10个文件。
还要检查您使用的格式。它可能会填满文件大小或特定格式的阈值。尝试TIF格式,然后尝试JPG,然后尝试BMP等。另外看看你是否可以用JPG格式将其压缩到40-50%并查看是否有任何改变。
让我知道你发现了什么。
答案 2 :(得分:0)
不要理解为什么你不能只加载600 mb,而限制是32 GB的2GB。 在任何情况下,您都可以通过此类转换器减少内存使用量:
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
var url = values[0] as string;
var imageConrol =(Image)values[1];
var container = (FrameworkElement)imageConrol.Parent;
if (string.IsNullOrEmpty(url) || container.ActualHeight<= 0)
{
return null;
}
var bi = new BitmapImage();
bi.BeginInit();
bi.CacheOption = BitmapCacheOption.None;
bi.CreateOptions = BitmapCreateOptions.IgnoreColorProfile;
bi.DecodePixelHeight = (int)container.ActualHeight;
bi.UriSource = new Uri(url, UriKind.Absolute);
// End initialization.
bi.EndInit();
bi.Freeze();
return bi;
}
来自MSDN
// Create Image Element
Image myImage = new Image();
myImage.Width = 200;
// Create source
BitmapImage myBitmapImage = new BitmapImage();
// BitmapImage.UriSource must be in a BeginInit/EndInit block
myBitmapImage.BeginInit();
myBitmapImage.UriSource = new Uri(@"C:\Documents and Settings\All Users\Documents\My Pictures\Sample Pictures\Water Lilies.jpg");
// To save significant application memory, set the DecodePixelWidth or
// DecodePixelHeight of the BitmapImage value of the image source to the desired
// height or width of the rendered image. If you don't do this, the application will
// cache the image as though it were rendered as its normal size rather then just
// the size that is displayed.
// Note: In order to preserve aspect ratio, set DecodePixelWidth
// or DecodePixelHeight but not both.
myBitmapImage.DecodePixelWidth = 200;
myBitmapImage.EndInit();
//set image source
myImage.Source = myBitmapImage;