2016-10-27 3 views
0

Я хочу, чтобы образ, который добавляется к FlowDocument загружается как растровые данные, когда это изображение видимого изменения страницы или прокруткой. (Не IsVisible недвижимости)Как загружать изображение динамически, когда изображение видимо в FlowDocument?

, потому что мой Senario является то, что изображения (PNG, JPG ...) находятся в zip-файле. , и я загружу zip-файл в память и распакую его в поток памяти. Итак, этот поток памяти имеет png, jpg двоичный (низкий размер). , и я изменяю эти двоичные данные png в класс BitmapImage. Этот класс bitmapImage добавлен в flowDocument.

Проблема в zip-файле имеет много файлов изображений, и после того, как я сменил изображения на классы BitmapImage, для этого требуется так много размера памяти.

Итак, я хочу изменить его ниже. 1. Сохраните данные в сжатом виде (png, jpg ...) в MemoryStream. 2. Добавьте эти изображения, не меняя их на BitmapClasses. 3. Динамическое изменение данных изображений в BitmapClasses, когда изображение должно отображаться путем просмотра страницы или прокрутки. Однако я не могу найти способ номер 2 выше. Я пробовал Display Image from Byte Array in WPF - Memory Issues, но в другой ситуации.

Как можно динамически загружать изображение, когда изображение отображается в FlowDocument?

+0

Вы не можете загрузить FlowDocument/build up. – Paparazzi

+0

Что делать, если вы, наконец, прошли все страницы или прокручивались до конца документа? Тогда все изображения должны были стать видимыми в любом случае. – Clemens

ответ

1

Вы можете попробовать этот путь. 1. расширьте Image Class и добавьте обработчик события IsVisibleChanged. 2. Класс имеет переменную потока памяти. 3. Когда вы добавляете изображения, просто добавляйте поток памяти, кроме источника. 4. Когда вызывается обработчик IsVisibleChanged, добавьте поток памяти в исходный код.

Это мой пример кода.

public class sampleImage : Image 
{ 
    public MemoryStream memoryStream = null; 
    public sampleImage() : base() 
    { 
     IsVisibleChanged += new DependencyPropertyChangedEventHandler(shandler); 
    } 
    void shandler(object sender, DependencyPropertyChangedEventArgs e) 
    { 
     if (IsVisible) 
     { 
      memoryStream.Position = 0; 
      var bitmap = BitmapFrame.Create(memoryStream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad); 
      Source = bitmap; 
     } else { 
      Source = null; 
      GC.Collect(); // it depends on you. 
     } 
    } 
} 
Смежные вопросы