VintaSoft Imaging .NET SDK v8.7
In This Topic
    Advanced functionality for image encoding
    In This Topic

    SDK allows to edit an image divided into tiles without reencoding the whole image. This is possible if decoder can return an object that implements the IRasterGridEditor interface.

    Editing images divided into tiles without reencoding the whole image

    The mechanism of editing image tiles allows to edit very large images of unlimited size consisting from tiles, which physically can not fit entirely into memory. Editing is implemented by changing the image tiles sequentially using an object which implements the IRasterGridEditor interface.

    Objects implementing IRasterGridEditor interface support the following methods:

    IRasterGridEditor interface is implemented in the following classes:

    DecoderBase class allows to get an instance that implements the IRasterGridEditor interface using the DecoderBase.GetRasterGridEditor method.


    Example: Here is an example which demonstrates how to get the image tile, change it and save back to the file:
    ' The project, which uses this code, must have references to the following assemblies:
    ' - Vintasoft.Imaging
    
    ''' <summary>
    ''' Gets an image of first tile of TIFF page,
    ''' rotates the tile image 180 degrees,
    ''' sets changed tile image as new image of first tile,
    ''' saves changes to the source TIFF file.
    ''' </summary>
    Public Shared Sub ChangeTileOfTiffPage(tiffFilename As String, pageIndex As Integer)
        Using stream As System.IO.Stream = New System.IO.FileStream(tiffFilename, System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite)
            Using decoder As New Vintasoft.Imaging.Codecs.Decoders.TiffDecoder(stream)
                ' get raster grid editor
                Dim rasterGridEditor As Vintasoft.Imaging.Codecs.ImageFiles.IRasterGridEditor = decoder.GetRasterGridEditor()
                ' get grid of raster regions
                Dim grid As System.Drawing.Rectangle() = rasterGridEditor.GetRasterEditorGrid(pageIndex)
                If grid Is Nothing OrElse grid.Length = 0 Then
                    Throw New System.Exception("Image tiles cannot be changed.")
                End If
    
                ' index of the region to change
                Dim rectIndex As Integer = 0
                ' get region to change
                Dim region As System.Drawing.Rectangle = grid(rectIndex)
                ' image of changing region
                Dim regionImage As Vintasoft.Imaging.VintasoftImage
                ' create image renderer
                Using renderer As New Vintasoft.Imaging.ImageRendering.ImageRenderer(decoder, pageIndex)
                    ' create region rendering task
                    Dim renderingTask As Vintasoft.Imaging.ImageRendering.ImageRenderingTask = Vintasoft.Imaging.ImageRendering.ImageRenderingTask.CreateImageRegion(region)
                    ' set to convert to the source format
                    renderingTask.ConvertDestImageToSourceFormat = True
                    ' get an image of first tile
                    regionImage = renderer.ExecuteRendering(renderingTask)
                End Using
    
                ' rotate the tile image 180 degrees
                regionImage.Flip(Vintasoft.Imaging.ImageProcessing.Transforms.ImageRotateFlipType.Rotate180FlipNone)
    
                ' set the tile image as new image of first tile
                rasterGridEditor.SetImageRect(pageIndex, rectIndex, regionImage, Nothing)
                regionImage.Dispose()
    
                ' save changes to the source TIFF file
                rasterGridEditor.SaveChanges(Nothing)
            End Using
        End Using
                  
    
    // The project, which uses this code, must have references to the following assemblies:
    // - Vintasoft.Imaging
    
    /// <summary>
    /// Gets an image of first tile of TIFF page,
    /// rotates the tile image 180 degrees,
    /// sets changed tile image as new image of first tile,
    /// saves changes to the source TIFF file.
    /// </summary>
    public static void ChangeTileOfTiffPage(string tiffFilename, int pageIndex)
    {
        using (System.IO.Stream stream = new System.IO.FileStream(
            tiffFilename, System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite))
        {
            using (Vintasoft.Imaging.Codecs.Decoders.TiffDecoder decoder =
                new Vintasoft.Imaging.Codecs.Decoders.TiffDecoder(stream))
            {
                // get raster grid editor
                Vintasoft.Imaging.Codecs.ImageFiles.IRasterGridEditor rasterGridEditor = decoder.GetRasterGridEditor();
                // get grid of raster regions
                System.Drawing.Rectangle[] grid = rasterGridEditor.GetRasterEditorGrid(pageIndex);
                if (grid == null || grid.Length == 0)
                    throw new System.Exception("Image tiles cannot be changed.");
    
                // index of the region to change
                int rectIndex = 0;
                // get region to change
                System.Drawing.Rectangle region = grid[rectIndex];
                // image of changing region
                Vintasoft.Imaging.VintasoftImage regionImage;
                // create image renderer
                using (Vintasoft.Imaging.ImageRendering.ImageRenderer renderer =
                    new Vintasoft.Imaging.ImageRendering.ImageRenderer(decoder, pageIndex))
                {
                    // create region rendering task
                    Vintasoft.Imaging.ImageRendering.ImageRenderingTask renderingTask =
                        Vintasoft.Imaging.ImageRendering.ImageRenderingTask.CreateImageRegion(region);
                    // set to convert to the source format
                    renderingTask.ConvertDestImageToSourceFormat = true;
                    // get an image of first tile
                    regionImage = renderer.ExecuteRendering(renderingTask);
                }
    
                // rotate the tile image 180 degrees
                regionImage.Flip(Vintasoft.Imaging.ImageProcessing.Transforms.ImageRotateFlipType.Rotate180FlipNone);
    
                // set the tile image as new image of first tile
                rasterGridEditor.SetImageRect(pageIndex, rectIndex, regionImage, null);
                regionImage.Dispose();
    
                // save changes to the source TIFF file
                rasterGridEditor.SaveChanges(null);
            }
        }