VintaSoft Imaging .NET SDK 14.0: Документация для .NET разработчика
В этом разделе
    Расширенный функционал для декодирования изображений
    В этом разделе
    SDK включает следующие интерфейсы для оптимального декодирования данных изображения:
    ImageRenderer класс декодирует часть или масштабированную часть изображения наиболее оптимальным способом и без загрузки всего изображения в память, если декодер реализует один или несколько из следующих интерфейсов: IRasterGridDecoder, ILineInterlacedDecoder, ISimpleLineInterlacedDecoder, IVectorDecoder.

    Важно! Класс ImageRenderer рекомендуется использовать для решения следующих задач:
    Классы ImageViewer и WpfImageViewer могут загружать только необходимую часть изображения, когда изображение отображается в просмотрщике изображений, если декодер реализует один или несколько из следующих интерфейсов: IRasterGridDecoder, ILineInterlacedDecoder, ISimpleLineInterlacedDecoder, IVectorDecoder. Эту функциональность можно включить/отключить с помощью свойств ImageViewer.RenderingRequirements и WpfImageViewerBase.RenderingRequirements.

    ImageViewer и WpfImageViewer могут постепенно загружать изображение в просмотрщик изображений, если декодер реализует интерфейс IVectorDecoder. Эту функциональность можно включить/отключить с помощью свойств ImageViewer.IntermediateImagePreviewInterval и WpfImageViewer.IntermediateImagePreviewInterval.


    ThumbnailViewer и WpfThumbnailViewer могут отображать миниатюру изображения без загрузки всего изображения в память, если декодер реализует один или несколько из следующих интерфейсов: IRasterGridDecoder, ILineInterlacedDecoder, ISimpleLineInterlacedDecoder, IVectorDecoder.


    Вот C#/VB.NET код, который демонстрирует, как отрендерить указанную область изображения в указанном масштабе с помощью класса ImageRenderer:
    /// <summary>
    /// Returns the scaled image region.
    /// </summary>
    /// <param name="image">The source image.</param>
    /// <param name="rect">The image region on source image, which should be rendered.</param>
    /// <param name="scale">The scale factor, which should be applied to the image region.</param>
    /// <returns>The scaled image region.</returns>
    public static Vintasoft.Imaging.VintasoftImage RenderScaledImageRegion(
        Vintasoft.Imaging.VintasoftImage image,
        System.Drawing.Rectangle rect,
        float scale)
    {
        // create the image renderer
        using (Vintasoft.Imaging.ImageRendering.ImageRenderer renderer = 
            new Vintasoft.Imaging.ImageRendering.ImageRenderer(image))
        {
            // create the rendering task
            Vintasoft.Imaging.ImageRendering.ImageRenderingTask task = 
                Vintasoft.Imaging.ImageRendering.ImageRenderingTask.CreateImageRegion(rect, scale);
            // execute the rendering
            return renderer.ExecuteRendering(task);
        }
    }
    
    ''' <summary>
    ''' Returns the scaled image region.
    ''' </summary>
    ''' <param name="image">The source image.</param>
    ''' <param name="rect">The image region on source image, which should be rendered.</param>
    ''' <param name="scale">The scale factor, which should be applied to the image region.</param>
    ''' <returns>The scaled image region.</returns>
    Public Shared Function RenderScaledImageRegion(image As Vintasoft.Imaging.VintasoftImage, rect As System.Drawing.Rectangle, scale As Single) As Vintasoft.Imaging.VintasoftImage
        ' create the image renderer
        Using renderer As New Vintasoft.Imaging.ImageRendering.ImageRenderer(image)
            ' create the rendering task
            Dim task As Vintasoft.Imaging.ImageRendering.ImageRenderingTask = Vintasoft.Imaging.ImageRendering.ImageRenderingTask.CreateImageRegion(rect, scale)
            ' execute the rendering
            Return renderer.ExecuteRendering(task)
        End Using
    End Function
    



    1. Декодирование части или масштабированной части растрового изображения

    За декодирование растрового изображения отвечают следующие интерфейсы:
    IRasterGridDecoder интерфейс может быть реализован в декодере растровых изображений, который может использовать сетку изображения с масштабированием для декодирования изображения. Интерфейс предоставляет широкие возможности для получения части или целого изображения в необходимом масштабе без необходимости декодирования всего изображения. Класс, реализующий этот интерфейс, должен поддерживать следующие методы:
    ILineInterlacedDecoder может быть реализован в декодере растровых изображений, который может эффективно пропускать одну или несколько строк изображения при декодировании части изображения. Класс, реализующий этот интерфейс, должен поддерживать метод ILineInterlacedDecoder.GetImage, который выполняет рендеринг изображения с заданными настройками чересстрочного декодирования (InterlaceSettings).

    Класс InterlaceSettings определяет следующие настройки чересстрочного декодирования:
    ISimpleLineInterlacedDecoder может быть реализован в декодере растровых изображений, который может эффективно пропускать одну или несколько строк изображения при декодировании всего изображения. Декодер, реализующий этот интерфейс, должен поддерживать метод ISimpleLineInterlacedDecoder.GetImage, который выполняет рендеринг изображения с заданным шагом чересстрочной развертки.


    Вот C#/VB.NET код, который демонстрирует, как отрендерить часть JPEG2000 изображения, уменьшенную в 4 раза:
    /// <summary>
    /// Returns a 4 times downscaled image of left-top rectangle of JPEG2000 image.
    /// </summary>
    public static Vintasoft.Imaging.VintasoftImage GetJpeg2000RectangleDownscaled4(string filename)
    {
        using (System.IO.Stream stream =
            new System.IO.FileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read))
        {
            using (Vintasoft.Imaging.Codecs.Decoders.Jpeg2000Decoder decoder =
                new Vintasoft.Imaging.Codecs.Decoders.Jpeg2000Decoder(stream))
            {
                // check available scales
                int[] scales = decoder.GetImageRectScales(0, decoder.GetDefaultDecodingSettings(0));
                for (int i = 0; i < scales.Length; i++)
                {
                    if (scales[i] == 4)
                    {
                        // get top-left rectangle of raster grid with scale 4
                        return decoder.GetImageRect(0, 0, 4, null, null, null);
                    }
                }
    
                throw new System.Exception("Scale 4 is not available for specified JPEG2000 file.");
            }
        }
    }
    
    ''' <summary>
    ''' Returns a 4 times downscaled image of left-top rectangle of JPEG2000 image.
    ''' </summary>
    Public Shared Function GetJpeg2000RectangleDownscaled4(filename As String) As Vintasoft.Imaging.VintasoftImage
        Using stream As System.IO.Stream = New System.IO.FileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read)
            Using decoder As New Vintasoft.Imaging.Codecs.Decoders.Jpeg2000Decoder(stream)
                ' check available scales
                Dim scales As Integer() = decoder.GetImageRectScales(0, decoder.GetDefaultDecodingSettings(0))
                For i As Integer = 0 To scales.Length - 1
                    If scales(i) = 4 Then
                        ' get top-left rectangle of raster grid with scale 4
                        Return decoder.GetImageRect(0, 0, 4, Nothing, Nothing, Nothing)
                    End If
                Next
    
                Throw New System.Exception("Scale 4 is not available for specified JPEG2000 file.")
            End Using
        End Using
    End Function
    



    2. Рендеринг области векторного изображения

    Интерфейс IVectorDecoder отвечает за рендеринг некоторой части векторного изображения. Интерфейс IVectorDecoder может быть реализован в декодере векторных изображений и реализуется классами PdfDecoder, DocxDecoder и XlsxDecoder. Интерфейс IVectorDecoder определяет единственный метод IVectorDecoder.GetImage, который имеет следующие параметры:
    Вот C#/VB.NET код, который демонстрирует, как получить часть страницы PDF документа:
    /// <summary>
    /// Returns an enlarged image of the central region of PDF page.
    /// </summary>
    public static Vintasoft.Imaging.VintasoftImage GetEnlargedImageOfPdfPageRegion(string filename, int pageIndex)
    {
        using (System.IO.Stream stream =
            new System.IO.FileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read))
        {
            using (Vintasoft.Imaging.Codecs.Decoders.PdfDecoder decoder =
                new Vintasoft.Imaging.Codecs.Decoders.PdfDecoder(stream))
            {
                // settings for page rendering
                Vintasoft.Imaging.Codecs.Decoders.RenderingSettings renderingSettings =
                    Vintasoft.Imaging.Codecs.Decoders.RenderingSettings.Empty;
                // get page info
                Vintasoft.Imaging.Codecs.Decoders.ImageInfo pageInfo = decoder.GetImageInfo(pageIndex, renderingSettings, null);
    
                // determine region on page
                float x = 3f * pageInfo.Width / 8f;
                float y = 3f * pageInfo.Height / 8f;
                float width = pageInfo.Width / 4f;
                float height = pageInfo.Height / 4f;
                System.Drawing.RectangleF rect = new System.Drawing.RectangleF(x, y, width, height);
    
                // get the central region with size of 1/4 page and scale 4
                return decoder.GetImage(pageIndex, rect, 4f, null, renderingSettings, null, null);
            }
        }
    }
    
    ''' <summary>
    ''' Returns an enlarged image of the central region of PDF page.
    ''' </summary>
    Public Shared Function GetEnlargedImageOfPdfPageRegion(filename As String, pageIndex As Integer) As Vintasoft.Imaging.VintasoftImage
        Using stream As System.IO.Stream = New System.IO.FileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read)
            Using decoder As New Vintasoft.Imaging.Codecs.Decoders.PdfDecoder(stream)
                ' settings for page rendering
                Dim renderingSettings As Vintasoft.Imaging.Codecs.Decoders.RenderingSettings = Vintasoft.Imaging.Codecs.Decoders.RenderingSettings.Empty
                ' get page info
                Dim pageInfo As Vintasoft.Imaging.Codecs.Decoders.ImageInfo = decoder.GetImageInfo(pageIndex, renderingSettings, Nothing)
    
                ' determine region on page
                Dim x As Single = 3F * pageInfo.Width / 8F
                Dim y As Single = 3F * pageInfo.Height / 8F
                Dim width As Single = pageInfo.Width / 4F
                Dim height As Single = pageInfo.Height / 4F
                Dim rect As New System.Drawing.RectangleF(x, y, width, height)
    
                ' get the central region with size of 1/4 page and scale 4
                Return decoder.GetImage(pageIndex, rect, 4F, Nothing, renderingSettings, Nothing, _
                    Nothing)
            End Using
        End Using
    End Function
    



    2.1. Получение промежуточных изображений при рендеринге изображения

    Классы ImageViewer, WpfImageViewer и ImageRenderingTask позволяют получать промежуточные изображения при рендеринге векторного изображения. Эта функция визуально ускоряет процесс рендеринга сложных векторных изображений. Интервал отображения промежуточных изображений можно задать с помощью следующих свойств:
    Для корректной работы вышеописанного механизма векторный декодер должен блокировать рендеринг изображения с неисключительными правами на запись.