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

    Создать декодер изображений, реализующий интерфейс IRasterGridDecoder

    Вот C#/VB.NET код, который демонстрирует, как создать класс RasterGridDecoderExample, производный от класса DecoderBase, который реализует интерфейс IRasterGridDecoder и может декодировать изображения из .rgce-файлов ( RasterGridSource.rgce ):
    /// <summary>
    /// Provides the image decoder for IRasterGridDecoder example.
    /// </summary>
    public class RasterGridDecoderExample : Vintasoft.Imaging.Codecs.Decoders.DecoderBase, Vintasoft.Imaging.Codecs.Decoders.IRasterGridDecoder
    {
    
        #region Constants
    
        /// <summary>
        /// The rect decoding time, in milliseconds (emulate image decoding).
        /// </summary>
        private const int RectDecodingTimeMs = 1;
    
        #endregion
    
    
    
        #region Fields
    
        /// <summary>
        /// The list with information about pages.
        /// </summary>
        List<RasterGridPageMetadata> _pageInfos = new List<RasterGridPageMetadata>();
    
        #endregion
    
    
    
        #region Constructors
    
        /// <summary>
        /// Initializes a new instance of the <see cref="RasterGridDecoderExample"/> class.
        /// </summary>
        /// <remarks>
        /// This constructor is used in <see cref="T:Vintasoft.Imaging.Codecs.Decoders.AvailableDecoders" /> and
        /// should not be used in real applications.
        /// </remarks>
        public RasterGridDecoderExample()
        {
        }
    
        /// <summary>
        /// Initializes a new instance of the <see cref="RasterGridDecoderExample"/> class.
        /// </summary>
        /// <param name="stream">The stream, which stores raw data of image/document source.</param>
        public RasterGridDecoderExample(Stream stream)
            : base(stream)
        {
            if (!IsValidFormat(stream))
                throw new NotSupportedException();
            StreamReader reader = new StreamReader(stream);
            while (!reader.EndOfStream)
            {
                _pageInfos.Add(RasterGridPageMetadata.Parse(reader));
            }
        }
    
        #endregion
    
    
    
        #region Properties
    
        /// <summary>
        /// Gets the name of the decoder.
        /// </summary>
        public override string Name
        {
            get
            {
                return RasterGridCodecExample.CodecName;
            }
        }
    
        #endregion
    
    
    
        #region Methods
    
        #region PUBLIC
    
        /// <summary>
        /// Determines that decoder can read a region of the image.
        /// </summary>
        /// <param name="scale">The rect scale.</param>
        /// <param name="pageIndex">The zero based page index.</param>
        /// <param name="decodingSettings">The decoding settings that should be used for decoding of page image.</param>
        /// <returns>
        /// <b>True</b> if decoder can read a region of the image;<br /><b>false</b> if decoder can read only rectangle of the image.
        /// </returns>
        /// <remarks>
        /// <i>Region</i> represents a rectangular region on the image and
        /// composed from a sequence of rectangles.
        /// </remarks>
        public bool CanReadImageRegion(int pageIndex, int scale, Vintasoft.Imaging.Codecs.Decoders.DecodingSettings decodingSettings)
        {
            return _pageInfos[pageIndex].CanReadImageRegion;
        }
    
        /// <summary>
        /// Determines that decoder can progressively read the image.
        /// </summary>
        /// <param name="pageIndex">The zero based page index.</param>
        /// <param name="decodingSettings">The decoding settings that should be used for decoding of page image.</param>
        /// <returns>
        /// <b>True</b> if decoder can progressively read the image;<br /><b>false</b> if decoder cannot progressively read the image.
        /// </returns>
        public bool CanUseProgressiveDecoding(int pageIndex, Vintasoft.Imaging.Codecs.Decoders.DecodingSettings decodingSettings)
        {
            return false;
        }
    
        /// <summary>
        /// Returns an image, which is associated with the specified page of image/document source.
        /// </summary>
        /// <param name="pageIndex">The zero-based page index in image/document source.</param>
        /// <param name="decodingSettings">The decoding settings that should be used for decoding of page image.</param>
        /// <param name="renderingSettings">Rendering settings used for rendering the image of page.
        /// This parameter has effect only if <see cref="P:Vintasoft.Imaging.Codecs.Decoders.DecoderBase.IsVectorDecoder" /> property is equal to <b>True</b>.</param>
        /// <param name="progressDelegate">Progress delegate.</param>
        /// <returns>
        /// Rendered image, which is associated with the specified page of image/document source, if decoder supports rendering;
        /// otherwise, image associated with the specified page of the image source.
        /// </returns>
        public override Vintasoft.Imaging.VintasoftImage GetImage(int pageIndex, 
            Vintasoft.Imaging.Codecs.Decoders.DecodingSettings decodingSettings, 
            Vintasoft.Imaging.Codecs.Decoders.RenderingSettings renderingSettings, 
            EventHandler<Vintasoft.Imaging.ProgressEventArgs> progressDelegate)
        {
            throw new NotSupportedException();
        }
    
        /// <summary>
        /// Returns information about image without loading the image data into memory.
        /// </summary>
        /// <param name="pageIndex">The zero-based page index in image/document source.</param>
        /// <param name="renderingSettings">Rendering settings used for getting info about the image of page.
        /// This parameter has effect only if <see cref="P:Vintasoft.Imaging.Codecs.Decoders.DecoderBase.IsVectorDecoder" /> property is equal to <b>True</b>.</param>
        /// <param name="decodingSettings">decoding settings used for getting info about the image of page.</param>
        /// <returns>
        /// Information about the image associated with the page of the source image.
        /// </returns>
        public override Vintasoft.Imaging.Codecs.Decoders.ImageInfo GetImageInfo(int pageIndex, 
            Vintasoft.Imaging.Codecs.Decoders.RenderingSettings renderingSettings,
            Vintasoft.Imaging.Codecs.Decoders.DecodingSettings decodingSettings)
        {
            RasterGridPageMetadata pageInfo = _pageInfos[pageIndex];
            return new Vintasoft.Imaging.Codecs.Decoders.ImageInfo(
                pageInfo.ImageWidth, pageInfo.ImageHeight, pageInfo.BitsPerPixel, new Vintasoft.Imaging.Palette(), pageInfo.Resolution);
        }
     
        /// <summary>
        /// Returns a scaled rectangle of raster image.
        /// </summary>
        /// <param name="pageIndex">The zero based page index.</param>
        /// <param name="rectIndex">The zero based the rectangle index.</param>
        /// <param name="scale">Scale factor. Possible values: 1 - original image rect should
        /// be get; N - reduced image rect should be get.</param>
        /// <param name="decodingSettings">The decoding settings that should be used for decoding of page image.</param>
        /// <param name="imageLoadingProgress">Delegate of the image loading progress.
        /// Can be set to <b>null</b> (<b>Nothing</b> in Visual Basic).</param>
        /// <param name="intermediateImageRequest">Delegate for requesting intermediate image.
        /// Can be set to <b>null</b> (<b>Nothing</b> in Visual Basic)</param>
        /// <returns>
        /// Scaled rectangle of image.
        /// </returns>
        public Vintasoft.Imaging.VintasoftImage GetImageRect(int pageIndex, int rectIndex, int scale,
            Vintasoft.Imaging.Codecs.Decoders.DecodingSettings decodingSettings, 
            EventHandler<Vintasoft.Imaging.ProgressEventArgs> imageLoadingProgress, 
            EventHandler<Vintasoft.Imaging.ImageRendering.IntermediateImageRequestEventArgs> intermediateImageRequest)
        {
            RasterGridPageMetadata pageInfo = _pageInfos[pageIndex];
            Rectangle[] grid = GetImageRectGrid(pageIndex, decodingSettings);
    
            Rectangle rect = grid[rectIndex];
    
            Vintasoft.Imaging.VintasoftImage image = CreateImage(rect.Width, rect.Height, scale, pageInfo);
            DrawTileInfo(image, $"{rectIndex}\n1/{scale}", scale);
    
            // emulate image decoding
            if (RectDecodingTimeMs > 0)
                System.Threading.Thread.Sleep(RectDecodingTimeMs);
    
            return image;
        }
    
        /// <summary>
        /// Returns a scaled region of raster image.
        /// </summary>
        /// <param name="pageIndex">The zero based page index.</param>
        /// <param name="leftTopRectIndex">The zero based index of left-top rectangle.</param>
        /// <param name="rightBottomRectIndex">The zero based index of right-bottom rectangle.</param>
        /// <param name="scale">Scale factor. Possible values: 1 - original image rect should
        /// be get; N - reduced image rect should be get.</param>
        /// <param name="decodingSettings">Decoding settings.</param>
        /// <param name="imageLoadingProgress">Delegate of the image loading progress.
        /// Can be set to <b>null</b> (<b>Nothing</b> in Visual Basic).</param>
        /// <param name="intermediateImageRequest">Delegate for requesting intermediate image.
        /// Can be set to <b>null</b> (<b>Nothing</b> in Visual Basic)</param>
        /// <returns>
        /// Scaled region of image.
        /// </returns>
        public Vintasoft.Imaging.VintasoftImage GetImageRegion(int pageIndex, int leftTopRectIndex, int rightBottomRectIndex, int scale,
            Vintasoft.Imaging.Codecs.Decoders.DecodingSettings decodingSettings, EventHandler<Vintasoft.Imaging.ProgressEventArgs> imageLoadingProgress, 
            EventHandler<Vintasoft.Imaging.ImageRendering.IntermediateImageRequestEventArgs> intermediateImageRequest)
        {
            RasterGridPageMetadata pageInfo = _pageInfos[pageIndex];
            Rectangle[] grid = GetImageRectGrid(pageIndex, decodingSettings);
    
            Rectangle leftTopRect = grid[leftTopRectIndex];
            Rectangle rightBottomRect = grid[rightBottomRectIndex];
    
            Rectangle rect = new Rectangle(
                leftTopRect.X, 
                leftTopRect.Y,
                rightBottomRect.X + rightBottomRect.Width - leftTopRect.X,
                rightBottomRect.Y + rightBottomRect.Height - leftTopRect.Y);
    
            Vintasoft.Imaging.VintasoftImage image = CreateImage(rect.Width, rect.Height, scale, pageInfo);
            DrawTileInfo(image, $"{leftTopRectIndex}:{rightBottomRectIndex}\n1/{scale}", scale);
    
            // emulate image decoding
            if (RectDecodingTimeMs > 0)
                System.Threading.Thread.Sleep(RectDecodingTimeMs);
    
            return image;
        }
    
        /// <summary>
        /// Returns an image grid as array of rectangles.
        /// </summary>
        /// <param name="pageIndex">The zero based page index.</param>
        /// <param name="decodingSettings">The decoding settings that should be used for decoding of page image.</param>
        /// <returns>
        /// An image grid as array of rectangles.
        /// </returns>
        /// <remarks>
        /// Method must return an array with one rectangle which size is equal to the size
        /// of image if decoder cannot get image by parts.
        /// </remarks>
        public Rectangle[] GetImageRectGrid(int pageIndex, Vintasoft.Imaging.Codecs.Decoders.DecodingSettings decodingSettings)
        {
            RasterGridPageMetadata pageInfo = _pageInfos[pageIndex];
            return SplitIntoTileRectangles(new Size(pageInfo.ImageWidth, pageInfo.ImageHeight), new Size(pageInfo.TileWidth, pageInfo.TileHeight));
        }
    
        /// <summary>
        /// Returns an array of scale factors for rectangles of image grid.
        /// </summary>
        /// <param name="pageIndex">The zero based page index.</param>
        /// <param name="decodingSettings">The decoding settings that should be used for decoding of page image.</param>
        /// <returns>
        /// An array of scale factors for rectangles of image grid.
        /// </returns>
        /// <remarks>
        /// Possible values of scale factor:
        /// <ul><li>1 - decoder can return image rectangle without scaling</li><li>N - decoder can return an image rectangle reduced N times</li></ul>
        /// </remarks>
        public int[] GetImageRectScales(int pageIndex, Vintasoft.Imaging.Codecs.Decoders.DecodingSettings decodingSettings)
        {
            return _pageInfos[pageIndex].TileScales;
        }
    
        /// <summary>
        /// Returns a metadata of specified page of image/document source.
        /// </summary>
        /// <param name="pageIndex">The zero-based page index in image/document source.</param>
        /// <returns>
        /// A metadata of specified page of image/document source.
        /// </returns>
        public override Vintasoft.Imaging.Metadata.PageMetadata GetPageMetadata(int pageIndex)
        {
            return _pageInfos[pageIndex];
        }
    
        /// <summary>
        /// Determines that stream contains image file in format of this decoder.
        /// </summary>
        /// <param name="stream">Stream with binary data of the image file.</param>
        /// <returns>
        /// <b>True</b> if stream contains image file in format of this decoder; otherwise, <b>false</b>.
        /// </returns>
        public override bool IsValidFormat(Stream stream)
        {
            string name = Name;
            int index = 0;
            while (stream.ReadByte() != (byte)name[0])
            {
                if (index++ > 5)
                    return false;
            }
            stream.Position--;
    
            byte[] bytes = new byte[name.Length];
            stream.Read(bytes, 0, bytes.Length);
            for (int i = 0; i < bytes.Length; i++)
            {
                if (bytes[i] != (byte)name[i])
                    return false;
            }
    
            return true;
        }
    
        #endregion
    
    
        #region PROTECTED
    
        /// <summary>
        /// Returns the number of pages in the source file stream.
        /// </summary>
        /// <returns>
        /// The number of pages in the source file stream.
        /// </returns>
        protected override int GetPageCount()
        {
            return _pageInfos.Count;
        }
    
        #endregion
    
    
        #region PRIVATE
    
        /// <summary>
        /// Splits an image area into tile rectangles.
        /// </summary>
        /// <param name="imageSize">Size of the image.</param>
        /// <param name="tileSize">Size of the tile.</param>
        /// <returns>
        /// An image grid as array of rectangles.
        /// </returns>
        private static Rectangle[] SplitIntoTileRectangles(Size imageSize, Size tileSize)
        {
            List<Rectangle> rectangles = new List<Rectangle>();
    
            int rows = (int)Math.Ceiling((double)imageSize.Height / tileSize.Height);
            int cols = (int)Math.Ceiling((double)imageSize.Width / tileSize.Width);
    
            for (int row = 0; row < rows; row++)
            {
                for (int col = 0; col < cols; col++)
                {
                    int width = tileSize.Width;
                    int height = tileSize.Height;
    
                    if (col == cols - 1)
                        width = imageSize.Width - col * tileSize.Width;
    
                    if (row == rows - 1)
                        height = imageSize.Height - row * tileSize.Height;
    
                    rectangles.Add(new Rectangle(col * tileSize.Width, row * tileSize.Height, width, height));
                }
            }
    
            return rectangles.ToArray();
        }
    
    
        /// <summary>
        /// Draws the tile information.
        /// </summary>
        /// <param name="image">The image.</param>
        /// <param name="tileInfo">The tile information.</param>
        /// <param name="scale">The scale.</param>
        private void DrawTileInfo(Vintasoft.Imaging.VintasoftImage image, string tileInfo, int scale)
        {
            using (Vintasoft.Imaging.Drawing.DrawingEngine graphics = image.CreateDrawingEngine())
            {
                graphics.Clear(Color.White);
                using (Vintasoft.Imaging.Drawing.IDrawingFont font = graphics.DrawingFactory.CreateDefaultFont(Math.Max(10, 180f / scale)))
                using (Vintasoft.Imaging.Drawing.IDrawingBrush brush = graphics.DrawingFactory.CreateSolidBrush(Color.Black))
                {
    
                    graphics.DrawText(tileInfo, font, brush, new RectangleF(0, 0, image.Width, image.Height), 
                        new Vintasoft.Imaging.Drawing.TextLayoutProperties(Vintasoft.Imaging.AnchorType.Center, true));
                }
                using (Vintasoft.Imaging.Drawing.IDrawingPen pen = graphics.DrawingFactory.CreatePen(Color.Blue, 20.0f / scale))
                {
                    graphics.DrawRectangle(pen, new RectangleF(0, 0, image.Width, image.Height));
                }
            }
        }
    
        /// <summary>
        /// Creates the image.
        /// </summary>
        /// <param name="width">The width.</param>
        /// <param name="height">The height.</param>
        /// <param name="pageInfo">The page information.</param>
        /// <returns>A new instace of <see cref="VintasoftImage"/> class.</returns>
        private Vintasoft.Imaging.VintasoftImage CreateImage(int width, int height, int scale, RasterGridPageMetadata pageInfo)
        {
            Vintasoft.Imaging.PixelFormat pixelFormat;
            if (pageInfo.BitsPerPixel == 24)
                pixelFormat = Vintasoft.Imaging.PixelFormat.Bgr24;
            else if (pageInfo.BitsPerPixel == 32)
                pixelFormat = Vintasoft.Imaging.PixelFormat.Bgra32;
            else
                throw new NotImplementedException();
            return new Vintasoft.Imaging.VintasoftImage((int)Math.Round(width / (float)scale), (int)Math.Round(height / (float)scale), pixelFormat);
        }
    
        #endregion
    
        #endregion
    
    }
    
    
    /// <summary>
    /// Provides information about ratser page metadata and raster grid.
    /// </summary>
    public class RasterGridPageMetadata : Vintasoft.Imaging.Metadata.PageMetadata
    {
    
        #region Constructors
    
        /// <summary>
        /// Prevents a default instance of the <see cref="RasterGridPageMetadata"/> class from being created.
        /// </summary>
        private RasterGridPageMetadata()
            : base("RasterGridPageExample")
        {
        }
    
        #endregion
    
    
    
        #region Properties
    
        string _pageName = null;
        /// <summary>
        /// Gets the name of the page.
        /// </summary>
        public string PageName
        {
            get
            {
                return _pageName;
            }
        }
    
        int _imageWidth = 0;
        /// <summary>
        /// Gets the width of the image, in pixels.
        /// </summary>
        public override int ImageWidth
        {
            get
            {
                return _imageWidth;
            }
        }
    
        int _imageHeight = 0;
        /// <summary>
        /// Gets the height of the image, in pixels.
        /// </summary>
        public override int ImageHeight
        {
            get
            {
                return _imageHeight;
            }
        }
    
        /// <summary>
        /// Gets the bits per-pixel of the image.
        /// </summary>
        /// <value>
        /// The bits per pixel.
        /// </value>
        public override int BitsPerPixel
        {
            get
            {
                return 24;
            }
        }
    
        int _tileWidth = 0;
        /// <summary>
        /// Gets the width of the tile, in pixels, without scale.
        /// </summary>
        public int TileWidth
        {
            get
            {
                return _tileWidth;
            }
        }
    
        int _tileHeight = 0;
        /// <summary>
        /// Gets the height of the tile, in pixels, without scale.
        /// </summary>
        public int TileHeight
        {
            get
            {
                return _tileHeight;
            }
        }
    
        int[] _tileScales;
        /// <summary>
        /// Gets the supported tile scales.
        /// </summary>
        public int[] TileScales
        {
            get
            {
                return _tileScales;
            }
        }
    
        /// <summary>
        /// Gets a value indicating whether the information about image resolution is stored
        /// in an image page.
        /// </summary>
        public override bool HasResolution
        {
            get
            {
                return true;
            }
        }
    
        bool _canReadImageRegion = false;
        /// <summary>
        /// Gets a value that indicates that decoder can read a region of the image.
        /// </summary>
        public bool CanReadImageRegion
        {
            get
            {
                return _canReadImageRegion;
            }
        }
    
        #endregion
    
    
    
        #region Methods
    
        /// <summary>
        /// Parses page info uses specified reader.
        /// </summary>
        /// <param name="reader">The reader.</param>
        /// <returns>A new instance of <see cref="RasterGridPageMetadata"/> class.</returns>
        internal static RasterGridPageMetadata Parse(TextReader reader)
        {
            RasterGridPageMetadata result = new RasterGridPageMetadata();
    
            result._pageName = ReadLine(reader);
            result._imageWidth = ReadInt(reader);
            result._imageHeight = ReadInt(reader);
            result.Resolution = new Vintasoft.Imaging.Resolution(ReadInt(reader), ReadInt(reader));
            result._tileWidth = ReadInt(reader);
            result._tileHeight = ReadInt(reader);
            string[] scaleStrings = ReadLine(reader).Split(',');
            int[] scales = new int[scaleStrings.Length];
            for (int i = 0; i < scales.Length; i++)
            {
                scales[i] = int.Parse(scaleStrings[i].Trim());
            }
            result._tileScales = scales;
            result._canReadImageRegion = ReadLine(reader).ToLowerInvariant() == "true";
    
            return result;
        }
    
    
        /// <summary>
        /// Reads the string value from text reader.
        /// </summary>
        /// <param name="reader">The reader.</param>
        /// <returns>The line.</returns>
        private static string ReadLine(TextReader reader)
        {
            string result = reader.ReadLine();
            while (result == "" || result.StartsWith("'"))
                result = reader.ReadLine();
            return result;
        }
    
        /// <summary>
        /// Reads the int value from text reader.
        /// </summary>
        /// <param name="reader">The reader.</param>
        /// <returns>The int value.</returns>
        private static int ReadInt(TextReader reader)
        {
            return int.Parse(ReadLine(reader));
        }
    
        #endregion
    
    }
    
    ''' <summary>
    ''' Provides the image decoder for IRasterGridDecoder example.
    ''' </summary>
    Public Class RasterGridDecoderExample
        Inherits Vintasoft.Imaging.Codecs.Decoders.DecoderBase
        Implements Vintasoft.Imaging.Codecs.Decoders.IRasterGridDecoder
    
        #Region "Constants"
    
        ''' <summary>
        ''' The rect decoding time, in milliseconds (emulate image decoding).
        ''' </summary>
        Private Const RectDecodingTimeMs As Integer = 1
    
        #End Region
    
    
    
        #Region "Fields"
    
        ''' <summary>
        ''' The list with information about pages.
        ''' </summary>
        Private _pageInfos As New List(Of RasterGridPageMetadata)()
    
        #End Region
    
    
    
        #Region "Constructors"
    
        ''' <summary>
        ''' Initializes a new instance of the <see cref="RasterGridDecoderExample"/> class.
        ''' </summary>
        ''' <remarks>
        ''' This constructor is used in <see cref="T:Vintasoft.Imaging.Codecs.Decoders.AvailableDecoders" /> and
        ''' should not be used in real applications.
        ''' </remarks>
        Public Sub New()
        End Sub
    
        ''' <summary>
        ''' Initializes a new instance of the <see cref="RasterGridDecoderExample"/> class.
        ''' </summary>
        ''' <param name="stream">The stream, which stores raw data of image/document source.</param>
        Public Sub New(stream As Stream)
            MyBase.New(stream)
            If Not IsValidFormat(stream) Then
                Throw New NotSupportedException()
            End If
            Dim reader As New StreamReader(stream)
            While Not reader.EndOfStream
                _pageInfos.Add(RasterGridPageMetadata.Parse(reader))
            End While
        End Sub
    
        #End Region
    
    
    
        #Region "Properties"
    
        ''' <summary>
        ''' Gets the name of the decoder.
        ''' </summary>
        Public Overrides ReadOnly Property Name() As String Implements Vintasoft.Imaging.Codecs.Decoders.IRasterGridDecoder.Name
            Get
                Return RasterGridCodecExample.CodecName
            End Get
        End Property
    
        #End Region
    
    
    
        #Region "Methods"
    
        #Region "PUBLIC"
    
        ''' <summary>
        ''' Determines that decoder can read a region of the image.
        ''' </summary>
        ''' <param name="scale">The rect scale.</param>
        ''' <param name="pageIndex">The zero based page index.</param>
        ''' <param name="decodingSettings">The decoding settings that should be used for decoding of page image.</param>
        ''' <returns>
        ''' <b>True</b> if decoder can read a region of the image;<br /><b>false</b> if decoder can read only rectangle of the image.
        ''' </returns>
        ''' <remarks>
        ''' <i>Region</i> represents a rectangular region on the image and
        ''' composed from a sequence of rectangles.
        ''' </remarks>
        Public Function CanReadImageRegion(pageIndex As Integer, scale As Integer, decodingSettings As Vintasoft.Imaging.Codecs.Decoders.DecodingSettings) As Boolean Implements Vintasoft.Imaging.Codecs.Decoders.IRasterGridDecoder.CanReadImageRegion
            Return _pageInfos(pageIndex).CanReadImageRegion
        End Function
    
        ''' <summary>
        ''' Determines that decoder can progressively read the image.
        ''' </summary>
        ''' <param name="pageIndex">The zero based page index.</param>
        ''' <param name="decodingSettings">The decoding settings that should be used for decoding of page image.</param>
        ''' <returns>
        ''' <b>True</b> if decoder can progressively read the image;<br /><b>false</b> if decoder cannot progressively read the image.
        ''' </returns>
        Public Function CanUseProgressiveDecoding(pageIndex As Integer, decodingSettings As Vintasoft.Imaging.Codecs.Decoders.DecodingSettings) As Boolean Implements Vintasoft.Imaging.Codecs.Decoders.IRasterGridDecoder.CanUseProgressiveDecoding
            Return False
        End Function
    
        ''' <summary>
        ''' Returns an image, which is associated with the specified page of image/document source.
        ''' </summary>
        ''' <param name="pageIndex">The zero-based page index in image/document source.</param>
        ''' <param name="decodingSettings">The decoding settings that should be used for decoding of page image.</param>
        ''' <param name="renderingSettings">Rendering settings used for rendering the image of page.
        ''' This parameter has effect only if <see cref="P:Vintasoft.Imaging.Codecs.Decoders.DecoderBase.IsVectorDecoder" /> property is equal to <b>True</b>.</param>
        ''' <param name="progressDelegate">Progress delegate.</param>
        ''' <returns>
        ''' Rendered image, which is associated with the specified page of image/document source, if decoder supports rendering;
        ''' otherwise, image associated with the specified page of the image source.
        ''' </returns>
        Public Overrides Function GetImage(pageIndex As Integer, decodingSettings As Vintasoft.Imaging.Codecs.Decoders.DecodingSettings, renderingSettings As Vintasoft.Imaging.Codecs.Decoders.RenderingSettings, progressDelegate As EventHandler(Of Vintasoft.Imaging.ProgressEventArgs)) As Vintasoft.Imaging.VintasoftImage
            Throw New NotSupportedException()
        End Function
    
        ''' <summary>
        ''' Returns information about image without loading the image data into memory.
        ''' </summary>
        ''' <param name="pageIndex">The zero-based page index in image/document source.</param>
        ''' <param name="renderingSettings">Rendering settings used for getting info about the image of page.
        ''' This parameter has effect only if <see cref="P:Vintasoft.Imaging.Codecs.Decoders.DecoderBase.IsVectorDecoder" /> property is equal to <b>True</b>.</param>
        ''' <param name="decodingSettings">decoding settings used for getting info about the image of page.</param>
        ''' <returns>
        ''' Information about the image associated with the page of the source image.
        ''' </returns>
        Public Overrides Function GetImageInfo(pageIndex As Integer, renderingSettings As Vintasoft.Imaging.Codecs.Decoders.RenderingSettings, decodingSettings As Vintasoft.Imaging.Codecs.Decoders.DecodingSettings) As Vintasoft.Imaging.Codecs.Decoders.ImageInfo
            Dim pageInfo As RasterGridPageMetadata = _pageInfos(pageIndex)
            Return New Vintasoft.Imaging.Codecs.Decoders.ImageInfo(pageInfo.ImageWidth, pageInfo.ImageHeight, pageInfo.BitsPerPixel, New Vintasoft.Imaging.Palette(), pageInfo.Resolution)
        End Function
    
        ''' <summary>
        ''' Returns a scaled rectangle of raster image.
        ''' </summary>
        ''' <param name="pageIndex">The zero based page index.</param>
        ''' <param name="rectIndex">The zero based the rectangle index.</param>
        ''' <param name="scale">Scale factor. Possible values: 1 - original image rect should
        ''' be get; N - reduced image rect should be get.</param>
        ''' <param name="decodingSettings">The decoding settings that should be used for decoding of page image.</param>
        ''' <param name="imageLoadingProgress">Delegate of the image loading progress.
        ''' Can be set to <b>null</b> (<b>Nothing</b> in Visual Basic).</param>
        ''' <param name="intermediateImageRequest">Delegate for requesting intermediate image.
        ''' Can be set to <b>null</b> (<b>Nothing</b> in Visual Basic)</param>
        ''' <returns>
        ''' Scaled rectangle of image.
        ''' </returns>
        Public Function GetImageRect(pageIndex As Integer, rectIndex As Integer, scale As Integer, decodingSettings As Vintasoft.Imaging.Codecs.Decoders.DecodingSettings, imageLoadingProgress As EventHandler(Of Vintasoft.Imaging.ProgressEventArgs), intermediateImageRequest As EventHandler(Of Vintasoft.Imaging.ImageRendering.IntermediateImageRequestEventArgs)) As Vintasoft.Imaging.VintasoftImage Implements Vintasoft.Imaging.Codecs.Decoders.IRasterGridDecoder.GetImageRect
            Dim pageInfo As RasterGridPageMetadata = _pageInfos(pageIndex)
            Dim grid As Rectangle() = GetImageRectGrid(pageIndex, decodingSettings)
    
            Dim rect As Rectangle = grid(rectIndex)
    
            Dim image As Vintasoft.Imaging.VintasoftImage = CreateImage(rect.Width, rect.Height, scale, pageInfo)
            DrawTileInfo(image, "{rectIndex}" & vbLf & "1/{scale}", scale)
    
            ' emulate image decoding
            If RectDecodingTimeMs > 0 Then
                System.Threading.Thread.Sleep(RectDecodingTimeMs)
            End If
    
            Return image
        End Function
    
        ''' <summary>
        ''' Returns a scaled region of raster image.
        ''' </summary>
        ''' <param name="pageIndex">The zero based page index.</param>
        ''' <param name="leftTopRectIndex">The zero based index of left-top rectangle.</param>
        ''' <param name="rightBottomRectIndex">The zero based index of right-bottom rectangle.</param>
        ''' <param name="scale">Scale factor. Possible values: 1 - original image rect should
        ''' be get; N - reduced image rect should be get.</param>
        ''' <param name="decodingSettings">Decoding settings.</param>
        ''' <param name="imageLoadingProgress">Delegate of the image loading progress.
        ''' Can be set to <b>null</b> (<b>Nothing</b> in Visual Basic).</param>
        ''' <param name="intermediateImageRequest">Delegate for requesting intermediate image.
        ''' Can be set to <b>null</b> (<b>Nothing</b> in Visual Basic)</param>
        ''' <returns>
        ''' Scaled region of image.
        ''' </returns>
        Public Function GetImageRegion(pageIndex As Integer, leftTopRectIndex As Integer, rightBottomRectIndex As Integer, scale As Integer, decodingSettings As Vintasoft.Imaging.Codecs.Decoders.DecodingSettings, imageLoadingProgress As EventHandler(Of Vintasoft.Imaging.ProgressEventArgs), _
            intermediateImageRequest As EventHandler(Of Vintasoft.Imaging.ImageRendering.IntermediateImageRequestEventArgs)) As Vintasoft.Imaging.VintasoftImage Implements Vintasoft.Imaging.Codecs.Decoders.IRasterGridDecoder.GetImageRegion
            Dim pageInfo As RasterGridPageMetadata = _pageInfos(pageIndex)
            Dim grid As Rectangle() = GetImageRectGrid(pageIndex, decodingSettings)
    
            Dim leftTopRect As Rectangle = grid(leftTopRectIndex)
            Dim rightBottomRect As Rectangle = grid(rightBottomRectIndex)
    
            Dim rect As New Rectangle(leftTopRect.X, leftTopRect.Y, rightBottomRect.X + rightBottomRect.Width - leftTopRect.X, rightBottomRect.Y + rightBottomRect.Height - leftTopRect.Y)
    
            Dim image As Vintasoft.Imaging.VintasoftImage = CreateImage(rect.Width, rect.Height, scale, pageInfo)
            DrawTileInfo(image, "{leftTopRectIndex}:{rightBottomRectIndex}" & vbLf & "1/{scale}", scale)
    
            ' emulate image decoding
            If RectDecodingTimeMs > 0 Then
                System.Threading.Thread.Sleep(RectDecodingTimeMs)
            End If
    
            Return image
        End Function
    
        ''' <summary>
        ''' Returns an image grid as array of rectangles.
        ''' </summary>
        ''' <param name="pageIndex">The zero based page index.</param>
        ''' <param name="decodingSettings">The decoding settings that should be used for decoding of page image.</param>
        ''' <returns>
        ''' An image grid as array of rectangles.
        ''' </returns>
        ''' <remarks>
        ''' Method must return an array with one rectangle which size is equal to the size
        ''' of image if decoder cannot get image by parts.
        ''' </remarks>
        Public Function GetImageRectGrid(pageIndex As Integer, decodingSettings As Vintasoft.Imaging.Codecs.Decoders.DecodingSettings) As Rectangle() Implements Vintasoft.Imaging.Codecs.Decoders.IRasterGridDecoder.GetImageRectGrid
            Dim pageInfo As RasterGridPageMetadata = _pageInfos(pageIndex)
            Return SplitIntoTileRectangles(New Size(pageInfo.ImageWidth, pageInfo.ImageHeight), New Size(pageInfo.TileWidth, pageInfo.TileHeight))
        End Function
    
        ''' <summary>
        ''' Returns an array of scale factors for rectangles of image grid.
        ''' </summary>
        ''' <param name="pageIndex">The zero based page index.</param>
        ''' <param name="decodingSettings">The decoding settings that should be used for decoding of page image.</param>
        ''' <returns>
        ''' An array of scale factors for rectangles of image grid.
        ''' </returns>
        ''' <remarks>
        ''' Possible values of scale factor:
        ''' <ul><li>1 - decoder can return image rectangle without scaling</li><li>N - decoder can return an image rectangle reduced N times</li></ul>
        ''' </remarks>
        Public Function GetImageRectScales(pageIndex As Integer, decodingSettings As Vintasoft.Imaging.Codecs.Decoders.DecodingSettings) As Integer() Implements Vintasoft.Imaging.Codecs.Decoders.IRasterGridDecoder.GetImageRectScales
            Return _pageInfos(pageIndex).TileScales
        End Function
    
        ''' <summary>
        ''' Returns a metadata of specified page of image/document source.
        ''' </summary>
        ''' <param name="pageIndex">The zero-based page index in image/document source.</param>
        ''' <returns>
        ''' A metadata of specified page of image/document source.
        ''' </returns>
        Public Overrides Function GetPageMetadata(pageIndex As Integer) As Vintasoft.Imaging.Metadata.PageMetadata
            Return _pageInfos(pageIndex)
        End Function
    
        ''' <summary>
        ''' Determines that stream contains image file in format of this decoder.
        ''' </summary>
        ''' <param name="stream">Stream with binary data of the image file.</param>
        ''' <returns>
        ''' <b>True</b> if stream contains image file in format of this decoder; otherwise, <b>false</b>.
        ''' </returns>
        Public Overrides Function IsValidFormat(stream As Stream) As Boolean
            Dim name__1 As String = Name
            Dim index As Integer = 0
            While stream.ReadByte() <> CByte(AscW(name__1(0)))
                If System.Math.Max(System.Threading.Interlocked.Increment(index),index - 1) > 5 Then
                    Return False
                End If
            End While
            stream.Position -= 1
    
            Dim bytes As Byte() = New Byte(name__1.Length - 1) {}
            stream.Read(bytes, 0, bytes.Length)
            For i As Integer = 0 To bytes.Length - 1
                If bytes(i) <> CByte(AscW(name__1(i))) Then
                    Return False
                End If
            Next
    
            Return True
        End Function
    
        #End Region
    
    
        #Region "PROTECTED"
    
        ''' <summary>
        ''' Returns the number of pages in the source file stream.
        ''' </summary>
        ''' <returns>
        ''' The number of pages in the source file stream.
        ''' </returns>
        Protected Overrides Function GetPageCount() As Integer
            Return _pageInfos.Count
        End Function
    
        #End Region
    
    
        #Region "PRIVATE"
    
        ''' <summary>
        ''' Splits an image area into tile rectangles.
        ''' </summary>
        ''' <param name="imageSize">Size of the image.</param>
        ''' <param name="tileSize">Size of the tile.</param>
        ''' <returns>
        ''' An image grid as array of rectangles.
        ''' </returns>
        Private Shared Function SplitIntoTileRectangles(imageSize As Size, tileSize As Size) As Rectangle()
            Dim rectangles As New List(Of Rectangle)()
    
            Dim rows As Integer = CInt(Math.Truncate(Math.Ceiling(CDbl(imageSize.Height) / tileSize.Height)))
            Dim cols As Integer = CInt(Math.Truncate(Math.Ceiling(CDbl(imageSize.Width) / tileSize.Width)))
    
            For row As Integer = 0 To rows - 1
                For col As Integer = 0 To cols - 1
                    Dim width As Integer = tileSize.Width
                    Dim height As Integer = tileSize.Height
    
                    If col = cols - 1 Then
                        width = imageSize.Width - col * tileSize.Width
                    End If
    
                    If row = rows - 1 Then
                        height = imageSize.Height - row * tileSize.Height
                    End If
    
                    rectangles.Add(New Rectangle(col * tileSize.Width, row * tileSize.Height, width, height))
                Next
            Next
    
            Return rectangles.ToArray()
        End Function
    
    
        ''' <summary>
        ''' Draws the tile information.
        ''' </summary>
        ''' <param name="image">The image.</param>
        ''' <param name="tileInfo">The tile information.</param>
        ''' <param name="scale">The scale.</param>
        Private Sub DrawTileInfo(image As Vintasoft.Imaging.VintasoftImage, tileInfo As String, scale As Integer)
            Using graphics As Vintasoft.Imaging.Drawing.DrawingEngine = image.CreateDrawingEngine()
                graphics.Clear(Color.White)
                Using font As Vintasoft.Imaging.Drawing.IDrawingFont = graphics.DrawingFactory.CreateDefaultFont(Math.Max(10, 180F / scale))
                    Using brush As Vintasoft.Imaging.Drawing.IDrawingBrush = graphics.DrawingFactory.CreateSolidBrush(Color.Black)
    
                        graphics.DrawText(tileInfo, font, brush, New RectangleF(0, 0, image.Width, image.Height), New Vintasoft.Imaging.Drawing.TextLayoutProperties(Vintasoft.Imaging.AnchorType.Center, True))
                    End Using
                End Using
                Using pen As Vintasoft.Imaging.Drawing.IDrawingPen = graphics.DrawingFactory.CreatePen(Color.Blue, 20F / scale)
                    graphics.DrawRectangle(pen, New RectangleF(0, 0, image.Width, image.Height))
                End Using
            End Using
        End Sub
    
        ''' <summary>
        ''' Creates the image.
        ''' </summary>
        ''' <param name="width">The width.</param>
        ''' <param name="height">The height.</param>
        ''' <param name="pageInfo">The page information.</param>
        ''' <returns>A new instace of <see cref="VintasoftImage"/> class.</returns>
        Private Function CreateImage(width As Integer, height As Integer, scale As Integer, pageInfo As RasterGridPageMetadata) As Vintasoft.Imaging.VintasoftImage
            Dim pixelFormat As Vintasoft.Imaging.PixelFormat
            If pageInfo.BitsPerPixel = 24 Then
                pixelFormat = Vintasoft.Imaging.PixelFormat.Bgr24
            ElseIf pageInfo.BitsPerPixel = 32 Then
                pixelFormat = Vintasoft.Imaging.PixelFormat.Bgra32
            Else
                Throw New NotImplementedException()
            End If
            Return New Vintasoft.Imaging.VintasoftImage(CInt(Math.Truncate(Math.Round(width / CSng(scale)))), CInt(Math.Truncate(Math.Round(height / CSng(scale)))), pixelFormat)
        End Function
    
        #End Region
    
        #End Region
    
    End Class
    
    
    ''' <summary>
    ''' Provides information about ratser page metadata and raster grid.
    ''' </summary>
    Public Class RasterGridPageMetadata
        Inherits Vintasoft.Imaging.Metadata.PageMetadata
    
        #Region "Constructors"
    
        ''' <summary>
        ''' Prevents a default instance of the <see cref="RasterGridPageMetadata"/> class from being created.
        ''' </summary>
        Private Sub New()
            MyBase.New("RasterGridPageExample")
        End Sub
    
        #End Region
    
    
    
        #Region "Properties"
    
        Private _pageName As String = Nothing
        ''' <summary>
        ''' Gets the name of the page.
        ''' </summary>
        Public ReadOnly Property PageName() As String
            Get
                Return _pageName
            End Get
        End Property
    
        Private _imageWidth As Integer = 0
        ''' <summary>
        ''' Gets the width of the image, in pixels.
        ''' </summary>
        Public Overrides ReadOnly Property ImageWidth() As Integer
            Get
                Return _imageWidth
            End Get
        End Property
    
        Private _imageHeight As Integer = 0
        ''' <summary>
        ''' Gets the height of the image, in pixels.
        ''' </summary>
        Public Overrides ReadOnly Property ImageHeight() As Integer
            Get
                Return _imageHeight
            End Get
        End Property
    
        ''' <summary>
        ''' Gets the bits per-pixel of the image.
        ''' </summary>
        ''' <value>
        ''' The bits per pixel.
        ''' </value>
        Public Overrides ReadOnly Property BitsPerPixel() As Integer
            Get
                Return 24
            End Get
        End Property
    
        Private _tileWidth As Integer = 0
        ''' <summary>
        ''' Gets the width of the tile, in pixels, without scale.
        ''' </summary>
        Public ReadOnly Property TileWidth() As Integer
            Get
                Return _tileWidth
            End Get
        End Property
    
        Private _tileHeight As Integer = 0
        ''' <summary>
        ''' Gets the height of the tile, in pixels, without scale.
        ''' </summary>
        Public ReadOnly Property TileHeight() As Integer
            Get
                Return _tileHeight
            End Get
        End Property
    
        Private _tileScales As Integer()
        ''' <summary>
        ''' Gets the supported tile scales.
        ''' </summary>
        Public ReadOnly Property TileScales() As Integer()
            Get
                Return _tileScales
            End Get
        End Property
    
        ''' <summary>
        ''' Gets a value indicating whether the information about image resolution is stored
        ''' in an image page.
        ''' </summary>
        Public Overrides ReadOnly Property HasResolution() As Boolean
            Get
                Return True
            End Get
        End Property
    
        Private _canReadImageRegion As Boolean = False
        ''' <summary>
        ''' Gets a value that indicates that decoder can read a region of the image.
        ''' </summary>
        Public ReadOnly Property CanReadImageRegion() As Boolean
            Get
                Return _canReadImageRegion
            End Get
        End Property
    
        #End Region
    
    
    
        #Region "Methods"
    
        ''' <summary>
        ''' Parses page info uses specified reader.
        ''' </summary>
        ''' <param name="reader">The reader.</param>
        ''' <returns>A new instance of <see cref="RasterGridPageMetadata"/> class.</returns>
        Friend Shared Function Parse(reader As TextReader) As RasterGridPageMetadata
            Dim result As New RasterGridPageMetadata()
    
            result._pageName = ReadLine(reader)
            result._imageWidth = ReadInt(reader)
            result._imageHeight = ReadInt(reader)
            result.Resolution = New Vintasoft.Imaging.Resolution(ReadInt(reader), ReadInt(reader))
            result._tileWidth = ReadInt(reader)
            result._tileHeight = ReadInt(reader)
            Dim scaleStrings As String() = ReadLine(reader).Split(","C)
            Dim scales As Integer() = New Integer(scaleStrings.Length - 1) {}
            For i As Integer = 0 To scales.Length - 1
                scales(i) = Integer.Parse(scaleStrings(i).Trim())
            Next
            result._tileScales = scales
            result._canReadImageRegion = ReadLine(reader).ToLowerInvariant() = "true"
    
            Return result
        End Function
    
    
        ''' <summary>
        ''' Reads the string value from text reader.
        ''' </summary>
        ''' <param name="reader">The reader.</param>
        ''' <returns>The line.</returns>
        Private Shared Function ReadLine(reader As TextReader) As String
            Dim result As String = reader.ReadLine()
            While result = "" OrElse result.StartsWith("'")
                result = reader.ReadLine()
            End While
            Return result
        End Function
    
        ''' <summary>
        ''' Reads the int value from text reader.
        ''' </summary>
        ''' <param name="reader">The reader.</param>
        ''' <returns>The int value.</returns>
        Private Shared Function ReadInt(reader As TextReader) As Integer
            Return Integer.Parse(ReadLine(reader))
        End Function
    
        #End Region
    
    End Class
    



    Создать кодек изображений, предоставляющий декодер для декодирования изображений

    Вот C#/VB.NET код, который демонстрирует, как создать класс RasterGridCodecExample, производный от класса Codec и использующый класс RasterGridDecoderExample в качестве декодера изображения:
    /// <summary>
    /// Provides the image codec for IRasterGridDecoder example.
    /// </summary>
    /// <seealso cref="Register()"/>
    /// <seealso cref="EnableRendering(ImageViewerBase)"/>
    public class RasterGridCodecExample : Vintasoft.Imaging.Codecs.Codec
    {
    
        #region Constants
    
        /// <summary>
        /// The codec name.
        /// </summary>
        public const string CodecName = "RasterGridDecoderExample";
    
        #endregion
    
    
    
        #region Constructors
    
        /// <summary>
        /// Initializes a new instance of the <see cref="RasterGridCodecExample"/> class.
        /// </summary>
        public RasterGridCodecExample()
            : base(CodecName, ".rgce")
        {
        }
    
        #endregion
    
    
    
        #region Properties
    
        /// <summary>
        /// Gets a value indicating whether codec can create decoder.
        /// </summary>
        public override bool CanCreateDecoder
        {
            get
            {
                return true;
            }
        }
    
        /// <summary>
        /// Gets a value indicating whether codec can create encoder.
        /// </summary>
        public override bool CanCreateEncoder
        {
            get
            {
                return false;
            }
        }
    
        #endregion
    
    
    
        #region Methods
    
        /// <summary>
        /// Registers this codec in the SDK.
        /// </summary>
        public static void Register()
        {
            Vintasoft.Imaging.Codecs.AvailableCodecs.AddCodec(new RasterGridCodecExample());
        }
    
        /// <summary>
        /// Enables the rendering of this codec is specified viewer.
        /// </summary>
        /// <param name="viewer">The viewer.</param>
        public static void EnableRendering(Vintasoft.Imaging.UI.ImageViewerBase viewer)
        {
            viewer.RenderingRequirements.SetRequirement(CodecName, new Vintasoft.Imaging.ImageRendering.ImageSizeRenderingRequirement(0));
        }
    
        /// <summary>
        /// Creates a new decoder instance for decoding specified stream.
        /// </summary>
        /// <param name="stream">A stream which should be opened using decoder.</param>
        /// <param name="layoutSettings">A layout settings of document.</param>
        /// <returns>
        /// New decoder instance for specified stream.
        /// </returns>
        public override Vintasoft.Imaging.Codecs.Decoders.DecoderBase CreateDecoder(Stream stream, Vintasoft.Imaging.Codecs.Decoders.DocumentLayoutSettings layoutSettings)
        {
            return new RasterGridDecoderExample(stream);
        }
    
        /// <summary>
        /// Creates a new decoder instance of the codec.
        /// </summary>
        /// <returns>
        /// The new decoder instance of the codec.
        /// </returns>
        public override Vintasoft.Imaging.Codecs.Decoders.DecoderBase CreateDecoder()
        {
            return new RasterGridDecoderExample();
        }
    
        /// <summary>
        /// Creates a new encoder instance of the codec.
        /// </summary>
        /// <returns>
        /// The new encoder instance of the codec.
        /// </returns>
        /// <exception cref="System.NotSupportedException"></exception>
        public override Vintasoft.Imaging.Codecs.Encoders.EncoderBase CreateEncoder()
        {
            throw new NotSupportedException();
        }
    
        #endregion
    
    }
    
    ''' <summary>
    ''' Provides the image codec for IRasterGridDecoder example.
    ''' </summary>
    ''' <seealso cref="Register()"/>
    ''' <seealso cref="EnableRendering(ImageViewerBase)"/>
    Public Class RasterGridCodecExample
        Inherits Vintasoft.Imaging.Codecs.Codec
    
        #Region "Constants"
    
        ''' <summary>
        ''' The codec name.
        ''' </summary>
        Public Const CodecName As String = "RasterGridDecoderExample"
    
        #End Region
    
    
    
        #Region "Constructors"
    
        ''' <summary>
        ''' Initializes a new instance of the <see cref="RasterGridCodecExample"/> class.
        ''' </summary>
        Public Sub New()
            MyBase.New(CodecName, ".rgce")
        End Sub
    
        #End Region
    
    
    
        #Region "Properties"
    
        ''' <summary>
        ''' Gets a value indicating whether codec can create decoder.
        ''' </summary>
        Public Overrides ReadOnly Property CanCreateDecoder() As Boolean
            Get
                Return True
            End Get
        End Property
    
        ''' <summary>
        ''' Gets a value indicating whether codec can create encoder.
        ''' </summary>
        Public Overrides ReadOnly Property CanCreateEncoder() As Boolean
            Get
                Return False
            End Get
        End Property
    
        #End Region
    
    
    
        #Region "Methods"
    
        ''' <summary>
        ''' Registers this codec in the SDK.
        ''' </summary>
        Public Shared Sub Register()
            Vintasoft.Imaging.Codecs.AvailableCodecs.AddCodec(New RasterGridCodecExample())
        End Sub
    
        ''' <summary>
        ''' Enables the rendering of this codec is specified viewer.
        ''' </summary>
        ''' <param name="viewer">The viewer.</param>
        Public Shared Sub EnableRendering(viewer As Vintasoft.Imaging.UI.ImageViewerBase)
            viewer.RenderingRequirements.SetRequirement(CodecName, New Vintasoft.Imaging.ImageRendering.ImageSizeRenderingRequirement(0))
        End Sub
    
        ''' <summary>
        ''' Creates a new decoder instance for decoding specified stream.
        ''' </summary>
        ''' <param name="stream">A stream which should be opened using decoder.</param>
        ''' <param name="layoutSettings">A layout settings of document.</param>
        ''' <returns>
        ''' New decoder instance for specified stream.
        ''' </returns>
        Public Overrides Function CreateDecoder(stream As Stream, layoutSettings As Vintasoft.Imaging.Codecs.Decoders.DocumentLayoutSettings) As Vintasoft.Imaging.Codecs.Decoders.DecoderBase
            Return New RasterGridDecoderExample(stream)
        End Function
    
        ''' <summary>
        ''' Creates a new decoder instance of the codec.
        ''' </summary>
        ''' <returns>
        ''' The new decoder instance of the codec.
        ''' </returns>
        Public Overrides Function CreateDecoder() As Vintasoft.Imaging.Codecs.Decoders.DecoderBase
            Return New RasterGridDecoderExample()
        End Function
    
        ''' <summary>
        ''' Creates a new encoder instance of the codec.
        ''' </summary>
        ''' <returns>
        ''' The new encoder instance of the codec.
        ''' </returns>
        ''' <exception cref="System.NotSupportedException"></exception>
        Public Overrides Function CreateEncoder() As Vintasoft.Imaging.Codecs.Encoders.EncoderBase
            Throw New NotSupportedException()
        End Function
    
        #End Region
    
    End Class
    



    Зарегистрировать кодек изображения в SDK и указать, что просмотрщик изображений должен отображать изображение с использованием растровой сетки вместо загрузки всего изображения.

    Вот C#/VB.NET код, который демонстрирует, как создать Windows форму, позволяющую загрузить изображения из .rgce-файла и отобразить загруженные изображения в просмотрщике изображений:
    using System;
    using System.Windows.Forms;
    
    using Vintasoft.Imaging.UI;
    
    using DemosCommonCode;
    
    namespace UserGuide.Codecs.RasterGridDecoder
    {
        public partial class RasterGridExampleForm : Form
        {
    
            static RasterGridExampleForm()
            {
                // register the RasterGridCodecExample codec in the SDK
                RasterGridCodecExample.Register();
            }
    
            public RasterGridExampleForm()
            {
                InitializeComponent();
    
                // specify that image viewer must use 128MB cache
                imageViewer1.RendererCacheSize = 128;
    
                // specify that RasterGridCodecExample class must render images in thumbnail viewer
                RasterGridCodecExample.EnableRendering(thumbnailViewer1);
                // specify that RasterGridCodecExample class must render images in image viewer
                RasterGridCodecExample.EnableRendering(imageViewer1);
            }
    
    
    
            private void openButton_Click(object sender, EventArgs e)
            {
                // open RasterGridSource.rgce file using OpenFileDialog
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    // add images to the viewers
                    imageViewer1.Images.Add(openFileDialog1.FileName);
                }
            }
    
        }
    }
    
    
    Imports System.Windows.Forms
    
    Imports Vintasoft.Imaging.UI
    
    Imports DemosCommonCode
    
    Namespace UserGuide.Codecs.RasterGridDecoder
        Public Partial Class RasterGridExampleForm
            Inherits Form
    
            Shared Sub New()
                ' register the RasterGridCodecExample codec in the SDK
                RasterGridCodecExample.Register()
            End Sub
    
            Public Sub New()
                InitializeComponent()
    
                ' specify that image viewer must use 128MB cache
                imageViewer1.RendererCacheSize = 128
    
                ' specify that RasterGridCodecExample class must render images in thumbnail viewer
                RasterGridCodecExample.EnableRendering(thumbnailViewer1)
                ' specify that RasterGridCodecExample class must render images in image viewer
                RasterGridCodecExample.EnableRendering(imageViewer1)
            End Sub
    
    
    
            Private Sub openButton_Click(sender As Object, e As EventArgs)
                ' open RasterGridSource.rgce file using OpenFileDialog
                If openFileDialog1.ShowDialog() = DialogResult.OK Then
                    ' add images to the viewers
                    imageViewer1.Images.Add(openFileDialog1.FileName)
                End If
            End Sub
    
        End Class
    End Namespace