Открытие многостраничных файлов TIF в приложении Metro Win 8 в качестве источника изображения

Можно очень легко установить файл TiF (или TIFF) в приложении Metro в качестве источника изображения...

Image imm = new Image();
imm.Source = new BitmapImage(new Uri(filetiff_path));

Проблема в том, что содержимое, отображаемое на изображении, всегда является первой страницей Tif, и я не могу установить содержимое на другие страницы исходного файла.

В приложении WPF я могу сделать это с помощью класса System.Windows.Media.Imaging.TiffBitmapDecoder, который, похоже, не существует в приложении Metro Win 8.

Stream imageStreamSource = new FileStream(filetiff_path, FileMode.Open, FileAccess.Read, FileShare.Read);
TiffBitmapDecoder decoder = new TiffBitmapDecoder(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
BitmapSource bitmapSource = decoder.Frames[indexPage];

Где indexPage — это номер страницы, которую я хочу просмотреть.

Кто-нибудь знает подобное решение?


person user1630939    schedule 18.09.2013    source источник
comment
Я нашел решение своего собственного вопроса... по этой ссылке показан правильный код :-) social.msdn.microsoft.com/Forums/windowsapps/en-US/   -  person user1630939    schedule 18.09.2013


Ответы (1)


У меня нет опыта работы ни с TiffBitmapDecoder, ни с Metro WPF, но раньше я использовал аналогичную вещь в WPF, например:

using (System.Drawing.Image imageFile = System.Drawing.Image.FromFile("temp.tif"))
{
    System.Drawing.Imaging.FrameDimension frameDimensions = new System.Drawing.Imaging.FrameDimension(imageFile.FrameDimensionsList[0]);
    imageFile.SelectActiveFrame(frameDimensions, indexPage);
    using (System.Drawing.Bitmap newImage = new System.Drawing.Bitmap(imageFile.Size.Width, imageFile.Size.Height))
    {
        using (System.Drawing.Graphics gr = System.Drawing.Graphics.FromImage(newImage))
        {
            gr.Clear(System.Drawing.Color.White);
            gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            gr.DrawImage(imageFile, new System.Drawing.Rectangle(new System.Drawing.Point(0, 0), imageFile.Size));
        }
        //do whatever with the newImage bitmap
    }
}

SelectActiveFrame - это то, что вам нужно, так что вы можете попробовать это, если это также работает для вас...

person Noxthron    schedule 18.09.2013
comment
если подумать, я увидел, что вы можете напрямую использовать imageFile как BitmapSource сразу после использования SelectActiveFrame. Я использовал, как указано выше, потому что я рисовал больше растровых изображений поверх этого :) - person Noxthron; 18.09.2013