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

5

我有一张非常大的图片(600mb),大小为30000x30000,希望将其加载到wpf图像控件中。

我可以使用Windows照片查看器查看此图片!

我将我的测试应用程序设置为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个回答

4

64位应用程序.

和32位Windows操作系统一样,当在64位Windows操作系统上运行64位托管应用程序时,您所能创建的对象大小也受到2GB限制。


遇到了同样的问题。使用400mb tif图像作为图像源,WPF只显示一个白屏,没有内存使用量。通过编译应用程序针对特定的x64平台解决了问题。但是为什么?我还是不明白。为什么? - Frank Liu

3

从硬盘直接获取图片可以减少内存使用。

您可以使用BitmapCacheOption

下面的代码将直接从硬盘读取图像,生成小缩略图而不是原始图像缓存:

public BitmapImage memoryOptimizedBitmapRead(string url,FrameworkElement imageContainer)
        {
            if (string.IsNullOrEmpty(url) || imageContainer.ActualHeight<= 0)
            {
                return null;
            }

            var bi = new BitmapImage();
            bi.BeginInit();

            bi.CacheOption = BitmapCacheOption.None;
            bi.CreateOptions = BitmapCreateOptions.IgnoreColorProfile;
            bi.DecodePixelHeight = (int)imageContainer.ActualHeight;
            bi.UriSource = new Uri(url, UriKind.Absolute);

            // End initialization.
            bi.EndInit();
            bi.Freeze();
            return bi;

        }

最大缩略图尺寸由图像容器大小确定。

方法使用示例:

var image= new Image();
image.Source = memoryOptimizedBitmapRead(...);

2

我会将其分成10个(3000x3000)的段并将它们放入10个文件中。

同时检查一下你使用的格式。它可能已经填满了文件大小或特定格式的阈值。尝试使用TIF格式,然后尝试JPG,再尝试BMP等等。另外看看能否将其压缩到JPG格式的40-50%,看看是否有任何变化。

让我知道你发现了什么。


谢谢您的快速回复,明天我会尝试。我需要在图像中进行测量,所以对我来说最简单的方法是将其作为一个文件加载。 - Andreas
我尝试了其他格式,但不幸的是效果并不理想。 - Andreas
也不是 :(. 但感谢你的努力。也许有人正在想出解决方案。根据链接,bitmapsource 的最大大小为64gb,但也许 wpf 图像不支持这个大小... - Andreas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接