如何在WPF图像中加载非常大的源图像?

时间:2011-09-10 18:38:20

标签: wpf image view load

我有一个非常大的图像(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这样的小型工作正在发挥作用。

我做错了什么?因为我的英语不好而且提前感谢。

3 个答案:

答案 0 :(得分:3)

64-Bit Applications

  

与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;

http://msdn.microsoft.com/en-us/library/ms748873.aspx