Как загрузить очень большой исходный образ в образе WPF? - PullRequest
4 голосов
/ 10 сентября 2011

У меня очень большое изображение (600 МБ) 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;

Тестовое приложение просто показывает белый экран с этим большим изображением.

Меньшие, такие как 100 МБ и 7000x7000, работают.

Что я делаю не так? Прошу прощения за мой плохой английский и заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 20 сентября 2011

64-битные приложения .

Как и в 32-разрядных операционных системах Windows, существует ограничение в 2 ГБ на размер объекта, который вы можете создать при запуске 64-разрядного управляемого приложения в 64-разрядной операционной системе Windows.

2 голосов
/ 10 сентября 2011

Я бы разделил его на 10 (3000x3000) сегментов и поместил бы их в 10 файлов.

Также проверьте, в каком формате вы его используете.Это может быть заполнение порога для размера файла или для этого конкретного формата.Попробуйте формат TIF, затем JPG, затем BMP и т. Д. Также посмотрите, можете ли вы сжать его с форматом JPG до 40-50% и посмотрите, изменит ли это что-либо.

Дайте мне знать, что вы найдетевне.

0 голосов
/ 24 октября 2013

Не понимаю, почему вы не можете загрузить только 600 МБ, в то время как ограничение составляет 2 ГБ для 32-разрядных. В любом случае вы можете уменьшить использование памяти таким конвертером:

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

...