Ошибка рендеринга XPS из FlowDocument в изображениях

Это будет немного более длинный пост

Цель

Рендеринг XPS-документа из FlowDocument с сохранением исходных изображений (без преобразования)

Существующие сценарии

  1. Изображение добавляется корректно (сохраняет формат), но только первое. Затем кеш разбивается, только 1 изображение встраивается в XPS и используется для всех изображений.

  2. Все изображения добавлены и корректны, но конвертированы в PNG.

Разница возникает из-за комментирования/раскомментирования одной строки в методе GetImage (см. комментарии)

Минимальная витрина/проблемный код воссоздания

Imports System.Windows.Documents
Imports System.Windows.Documents.Serialization
Imports System.Windows.Xps.Packaging
Imports System.Windows.Xps
Imports System.IO
Imports System.IO.Packaging
Imports System.Windows.Markup
Imports System.Windows.Media.Imaging
Imports System.Windows.Media
Imports System.Windows.Controls

Module Module1

    Sub Main()

        Render()

    End Sub

    Sub Render()

        Using image1 = IO.File.OpenRead("image1.jpg"),
            image2 = IO.File.OpenRead("image2.png"),
            file = IO.File.Create("asdf.xps"),
            pack = Package.Open(file, FileMode.Create),
            d As New XpsDocument(pack)


            Dim writer As XpsDocumentWriter = XpsDocument.CreateXpsDocumentWriter(d)
            Dim xpsVisWriter As SerializerWriterCollator = writer.CreateVisualsCollator()

            Dim x As New FlowDocument
            x.PageWidth = 100
            x.ColumnWidth = x.PageWidth

            Dim s As New Section
            DirectCast(x, IAddChild).AddChild(s)
            s.BreakPageBefore = True

            Dim p As New Paragraph()
            DirectCast(s, IAddChild).AddChild(p)

            Dim i As New Image
            DirectCast(p, IAddChild).AddChild(i)
            i.Source = GetImage(image1)

            Dim i2 As New Image
            DirectCast(p, IAddChild).AddChild(i2)
            i2.Source = GetImage(image2)

            Dim paginator = DirectCast(x, IDocumentPaginatorSource).DocumentPaginator
            Dim pageIndex As Integer = 0

            While Not paginator.IsPageCountValid OrElse paginator.PageCount > pageIndex
                Dim page As DocumentPage = paginator.GetPage(pageIndex)


                xpsVisWriter.Write(page.Visual)
                pageIndex += 1
            End While


            xpsVisWriter.EndBatchWrite()

        End Using

    End Sub

    Function GetImage(stream As Stream) As ImageSource

        Dim result As ImageSource = BitmapFrame.Create(
            stream,
            BitmapCreateOptions.PreservePixelFormat Or BitmapCreateOptions.IgnoreImageCache,
            BitmapCacheOption.None)

        'If this Line Runs, scenario 2 occures, otherwise scenario 1
        'result = BitmapFrame.Create(result)

        Return result

    End Function

End Module

Я больше не знаю, что с этим делать. Перепробованы все возможные включения/выключения кеша.


person Ales Ruzicka    schedule 18.02.2014    source источник


Ответы (1)


Я не делал никаких Visual Basic, но столкнулся с аналогичной проблемой с С#. Попробуйте вернуть BitmapImage вместо ImageSource в методе GetImage. Использование PngBitmapDecoder, MemoryStream, FlowDocument, XPSDocument для предварительного просмотра изображений

person M312V    schedule 03.05.2014