WPF с привязкой к данным, многостраничные TIFF, потоки памяти и производительность - PullRequest
1 голос
/ 16 января 2012

У меня есть объект с привязкой к данным в элементе управления WPF, который «просматривает» размолвку.

Объект имеет открытый PreviewImage и CurrentPreviewPage.

Он имеет приватные PreviewPages, которые представляют собой набор MemoryStreams (каждый представляет страницу Tiff).

После получения PreviewImage (в первый раз) этот код запускается:

if (PreviewPages.Count == 0)
{
    Image myImg = System.Drawing.Image.FromFile(_LocalFile);

    for (int i = 0; i < (NumberOfPages); i++)
    {
        myImg.SelectActiveFrame(System.Drawing.Imaging.FrameDimension.Page, i);
        System.IO.MemoryStream ms = new System.IO.MemoryStream();
        myImg.Save(ms, System.Drawing.Imaging.ImageFormat.Tiff);
        PreviewPages.Add(ms);
    }
}

Предыдущий код занимает около 10 секунд для 17-страничного TIFF размером 1100 КБ. Должен быть лучший способ справиться с этим. После этого это называется:

BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.DecodePixelWidth = 1000;
//bi.UriSource = new Uri(fiTemp.FullName);
bi.StreamSource = new System.IO.MemoryStream(PreviewPages[CurrentPreviewPage - 1].ToArray());
bi.EndInit();
_PreviewImage = bi;

Теперь, после инициализации этот код работает фантастически (он может менять страницы так же быстро, как вы можете перетащить связанный ползунок). Любая помощь будет высоко ценится.

1 Ответ

2 голосов
/ 16 января 2012

Загрузите свою первую страницу в основной поток, а затем дополнительные страницы в фоновом режиме - см. BackGroundWorker. Только основной поток может получить доступ к пользовательскому интерфейсу. На BackGroundWorker вам нужно решить, будете ли вы получать страницы 2-х по одной за раз или все сразу. Пользователь не может перейти на страницу 2, пока вы не перенесете страницу 2 в поток пользовательского интерфейса. Я бы реализовал отмену. Если пользователь сдается, вы не хотите связывать процессор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...