VintaSoft Imaging .NET SDK 15.1: Documentation for .NET developer
In This Topic
An example of decoder that implements IRasterGridDecoder interface that supports large images
In This Topic
If you want to create the custom image codec with the ability to decode image using raster grid, you need to do the following steps:

Create an image decoder that implements IRasterGridDecoder interface

Here is C#/VB.NET code that demonstrates how to create RasterGridDecoderExample class that is derived from DecoderBase class, implements the IRasterGridDecoder interface and can decode images from .rgce-files (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



Create an image codec that provides decoder for image decoding

Here is C#/VB.NET code that demonstrates how to create RasterGridCodecExample class that is derived from Codec class and uses RasterGridDecoderExample class as image decoder:
/// <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



Register image codec in the SDK and specify that viewer must render image using raster grid instead of loading the whole image

Here is C#/VB.NET code that demonstrates how to create Windows form, which allows to load images from .rgce-file and display loaded images in image viewer:
using System;
using System.Windows.Forms;

using Vintasoft.Imaging.UI;

using CommonCode;

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 CommonCode

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