VintaSoft Imaging .NET SDK 12.4: Documentation for .NET developer
In This Topic
    Overview of codecs architecture
    In This Topic
    Definitions:


    The SDK contains the open architecture of image codecs, which is used for obtaining information, encoding and decoding images of various formats (TIFF, PDF, BMP, etc).

    All classes used for image encoding and decoding are located in Vintasoft.Imaging.Codecs namespace.

    The following diagram illustrates the logical links among base classes of the codecs architecture:


    The basic classes, illustrated on the above diagram, are divided into four levels of abstraction:
    1. The "codecs" level consists from AvailableCodecs, AvailableDecoders, AvailableEncoders,Codec and derived classes. AvailableCodecs, AvailableDecoders and AvailableEncoders classes provide information about available decoders and encoders as well as provide the ability to add and remove codecs. Codec and derived classes contain methods allowing to create encoder or decoder for specific image formats.
    2. The "encoder/decoder" level consists from EncoderBase and DecoderBase classes and derived classes,which provide the unified access to the functions intended for obtaining information and image encoding/decoding.
    3. The "image file" level consists from ImageFileBase<T> and derived classes and related classes. The classes, which are derived from ImageFileBase<T> andImagePage classes, provide the full access to all features of image decoding/encoding and to the metadata of specific format.
      ImageFileSource class is used by ImageFileBase<T> hierarchy classes for reading/writing binary data from an instance of System.IO.Stream object.
    4. The "encoded data" level represents System.IO.Stream class, which contains image data encoded ina specific format (TIFF, PDF, BMP, etc).


    1. Codec and AvailableCodecs classes

    Static AvailableCodecs class contains information about available codecs as well as provides the ability to remove and add new codecs:

    The Codec class is base class for all codecs. The Codec class defines how to create decoder and encoder for images of specific format.
    Codec class includes the following informative properties:

    New codec, derived from Codec class, always must implement at least the following methods:

    Important: The static Codec.CreateStandardCodec method allows to create by name a "standard" codec for the following image file formats: Bmp, Docx, Emf, Gif, Icon, Jbig2, Jpeg, Jpeg2000, Pbm, Pdf, Png, Raw, Tga, Tiff, Webp, Wmf, Xlsx.


    Here is C#/VB.NET code that demonstrates how to obtain information about available codecs and their characteristics:
    /// <summary>
    /// Shows detailed information about available codecs.
    /// </summary>
    public static void ShowAvailableCodecsInfo()
    {
        foreach (Vintasoft.Imaging.Codecs.Codec codec in Vintasoft.Imaging.Codecs.AvailableCodecs.Codecs)
        {
            string codecInfo = "";
            if (codec.CanCreateDecoder && codec.CanCreateEncoder)
                codecInfo = "decoder, encoder";
            else if (codec.CanCreateDecoder)
                codecInfo = "decoder";
            else if (codec.CanCreateEncoder)
                codecInfo = "encoder";
            System.Console.WriteLine(string.Format("{0} codec ({1}):", codec.Name, codecInfo));
            System.Console.Write("  File extensions:");
            for (int i = 0; i < codec.FileExtensions.Length; i++)
            {
                System.Console.Write(string.Format(" *{0}", codec.FileExtensions[i].ToLowerInvariant()));
            }
            System.Console.WriteLine();
        }
    }
    
    /* This code example produces the following output:
        
    Raw codec (decoder):
      File extensions: *.nef *.nrw *.cr2 *.crw *.dng
    Tiff codec (decoder, encoder):
      File extensions: *.tif *.tiff
    Gif codec (decoder, encoder):
      File extensions: *.gif
    Png codec (decoder, encoder):
      File extensions: *.png
    Jpeg codec (decoder, encoder):
      File extensions: *.jpg *.jpeg
    Bmp codec (decoder, encoder):
      File extensions: *.bmp
    Pdf codec (decoder, encoder):
      File extensions: *.pdf
    Jbig2 codec (decoder, encoder):
      File extensions: *.jb2 *.jbig2
    Jpeg2000 codec (decoder, encoder):
      File extensions: *.jp2 *.jpc *.j2k *.j2c
    Dicom codec (decoder):
      File extensions: *.dcm *.dic *.acr
    Docx codec (decoder):
      File extensions: *.docx
    Wmf codec (decoder):
      File extensions: *.wmf
    Emf codec (decoder):
      File extensions: *.emf
    Icon codec (decoder):
      File extensions: *.ico *.cur
    Jpeg-LS codec (decoder):
      File extensions: *.jls
    Pcx codec (decoder, encoder):
      File extensions: *.pcx
      
     */
    
    
            ''' <summary>
            ''' Shows detailed information about available codecs.
            ''' </summary>
            Public Shared Sub ShowAvailableCodecsInfo()
                For Each codec As Vintasoft.Imaging.Codecs.Codec In Vintasoft.Imaging.Codecs.AvailableCodecs.Codecs
                    Dim codecInfo As String = ""
                    If codec.CanCreateDecoder AndAlso codec.CanCreateEncoder Then
                        codecInfo = "decoder, encoder"
                    ElseIf codec.CanCreateDecoder Then
                        codecInfo = "decoder"
                    ElseIf codec.CanCreateEncoder Then
                        codecInfo = "encoder"
                    End If
                    System.Console.WriteLine(String.Format("{0} codec ({1}):", codec.Name, codecInfo))
                    System.Console.Write("  File extensions:")
                    For i As Integer = 0 To codec.FileExtensions.Length - 1
                        System.Console.Write(String.Format(" *{0}", codec.FileExtensions(i).ToLowerInvariant()))
                    Next
                    System.Console.WriteLine()
                Next
            End Sub
    
            ' This code example produces the following output:
    '
    '        Raw codec (decoder):
    '          File extensions: *.nef *.nrw *.cr2 *.crw *.dng
    '        Tiff codec (decoder, encoder):
    '          File extensions: *.tif *.tiff
    '        Gif codec (decoder, encoder):
    '          File extensions: *.gif
    '        Png codec (decoder, encoder):
    '          File extensions: *.png
    '        Jpeg codec (decoder, encoder):
    '          File extensions: *.jpg *.jpeg
    '        Bmp codec (decoder, encoder):
    '          File extensions: *.bmp
    '        Pdf codec (decoder, encoder):
    '          File extensions: *.pdf
    '        Jbig2 codec (decoder, encoder):
    '          File extensions: *.jb2 *.jbig2
    '        Jpeg2000 codec (decoder, encoder):
    '          File extensions: *.jp2 *.jpc *.j2k *.j2c
    '        Dicom codec (decoder):
    '          File extensions: *.dcm *.dic *.acr
    '        Docx codec (decoder):
    '          File extensions: *.docx
    '        Wmf codec (decoder):
    '          File extensions: *.wmf
    '        Emf codec (decoder):
    '          File extensions: *.emf
    '        Icon codec (decoder):
    '          File extensions: *.ico *.cur
    '        Jpeg-LS codec (decoder):
    '          File extensions: *.jls
    '        Pcx codec (decoder, encoder):
    '          File extensions: *.pcx
    '
    '
    
    
    



    2. DecoderBase and AvailableDecoders classes

    Static AvailableDecoders class contains information about available decoders and allows to:

    VintasoftImage object uses AvailableDecoders.CreateDecoder method for choosing the decoder, which allows to decode image data from stream or file, which contains image data.


    The DecoderBase class is base class for all decoders. The DecoderBase class defines the unified set of methods intended for obtaining metadata and image decoding:

    Here is C#/VB.NET code that demonstrates how to get the decoder for the specified stream and obtain information about all images encoded in that stream:
    /// <summary>
    /// Shows detailed information about pages of image stored in specified stream.
    /// </summary>
    public static void ShowInformationAboutPages(System.IO.Stream stream)
    {
        Vintasoft.Imaging.Codecs.Decoders.DecoderBase decoder;
        try
        {
            // create appropriate decoder
            decoder = Vintasoft.Imaging.Codecs.Decoders.AvailableDecoders.CreateDecoder(stream);
        }
        catch (Vintasoft.Imaging.Codecs.Decoders.DecoderException ex)
        {
            System.Console.WriteLine(ex.Message);
            return;
        }
    
        if (decoder == null)
        {
            System.Console.WriteLine("Appropriate decoder was not found.");
            return;
        }
    
        // get the number of pages
        System.Console.WriteLine(string.Format("Stream contains {0} page(s).", decoder.PageCount));
        for (int i = 0; i < decoder.PageCount; i++)
        {
            // get the information about the page
            Vintasoft.Imaging.Codecs.Decoders.ImageInfo pageImageInfo = decoder.GetImageInfo(i);
    
            System.Console.WriteLine();
    
            // get general image parameters
    
            System.Console.WriteLine(string.Format("Page {0}:", i + 1));
            System.Console.WriteLine(string.Format("  Image dimensions: {0}x{1} pixels", pageImageInfo.Width, pageImageInfo.Height));
            System.Console.WriteLine(string.Format("  Image resolution: {0}x{1} dpi",
                System.Math.Round(pageImageInfo.Resolution.Horizontal), System.Math.Round(pageImageInfo.Resolution.Vertical)));
            System.Console.WriteLine(string.Format("  Image bit depth: {0}", pageImageInfo.BitsPerPixel));
            System.Console.WriteLine(string.Format("  Image pixel format: {0}", pageImageInfo.PixelFormat));
    
            // get information about palette
    
            int paletteColorCount = pageImageInfo.Palette.ColorCount;
            if (paletteColorCount > 0)
                System.Console.WriteLine(string.Format("  Image has a palette with {0} colors", paletteColorCount));
            else
                System.Console.WriteLine(string.Format("  Image has no palette"));
            System.Console.WriteLine();
        }
    }
    
    ''' <summary>
    ''' Shows detailed information about pages of image stored in specified stream.
    ''' </summary>
    Public Shared Sub ShowInformationAboutPages(stream As System.IO.Stream)
        Dim decoder As Vintasoft.Imaging.Codecs.Decoders.DecoderBase
        Try
            ' create appropriate decoder
            decoder = Vintasoft.Imaging.Codecs.Decoders.AvailableDecoders.CreateDecoder(stream)
        Catch ex As Vintasoft.Imaging.Codecs.Decoders.DecoderException
            System.Console.WriteLine(ex.Message)
            Return
        End Try
    
        If decoder Is Nothing Then
            System.Console.WriteLine("Appropriate decoder was not found.")
            Return
        End If
    
        ' get the number of pages
        System.Console.WriteLine(String.Format("Stream contains {0} page(s).", decoder.PageCount))
        For i As Integer = 0 To decoder.PageCount - 1
            ' get the information about the page
            Dim pageImageInfo As Vintasoft.Imaging.Codecs.Decoders.ImageInfo = decoder.GetImageInfo(i)
    
            System.Console.WriteLine()
    
            ' get general image parameters
    
            System.Console.WriteLine(String.Format("Page {0}:", i + 1))
            System.Console.WriteLine(String.Format("  Image dimensions: {0}x{1} pixels", pageImageInfo.Width, pageImageInfo.Height))
            System.Console.WriteLine(String.Format("  Image resolution: {0}x{1} dpi", System.Math.Round(pageImageInfo.Resolution.Horizontal), System.Math.Round(pageImageInfo.Resolution.Vertical)))
            System.Console.WriteLine(String.Format("  Image bit depth: {0}", pageImageInfo.BitsPerPixel))
            System.Console.WriteLine(String.Format("  Image pixel format: {0}", pageImageInfo.PixelFormat))
    
            ' get information about palette
    
            Dim paletteColorCount As Integer = pageImageInfo.Palette.ColorCount
            If paletteColorCount > 0 Then
                System.Console.WriteLine(String.Format("  Image has a palette with {0} colors", paletteColorCount))
            Else
                System.Console.WriteLine(String.Format("  Image has no palette"))
            End If
            System.Console.WriteLine()
        Next
    End Sub
    



    3. EncoderBase, MultipageEncoderBase and AvailableEncoders classes

    Static AvailableEncoders class contains information about available encoders and allows to:

    VintasoftImage and ImageCollection objects use AvailableEncoders.CreateEncoder method to choose the encoder by name of encoded file.


    The EncoderBase class is base class for all encoders. The EncoderBase class defines unified set of methods intended for image encoding into single-page image format (PNG, BMP, JPEG, JPEG2000):

    The MultipageEncoderBase class is derived from EncoderBase and defines unified set of methods intended for encoding the image collection into multi-page image format (TIFF, PDF, GIF, JBIG2):

    Here is C#/VB.NET code that demonstrates how to choose an encoder for certain file and perform saving of image collection into the file:
    /// <summary>
    /// Gets an encoder by the filename extension,
    /// changes settings of the encoder and
    /// saves an image collection to a file using encoder.
    /// </summary>
    public static void ChangeEncoderSettingsAndSave(Vintasoft.Imaging.ImageCollection images, string filename)
    {
        // get an encoder by the filename extension
        Vintasoft.Imaging.Codecs.Encoders.EncoderBase encoder =
            Vintasoft.Imaging.Codecs.Encoders.AvailableEncoders.CreateEncoder(filename);
        // if encoder was not found
        if (encoder == null)
        {
            throw new System.Exception("Encoder is not found for specified file extension.");
        }
        // if encoder is TIFF
        if (encoder is Vintasoft.Imaging.Codecs.Encoders.TiffEncoder)
        {
            // specify that encoded image must be divided into tiles with size 512x512
            (encoder as Vintasoft.Imaging.Codecs.Encoders.TiffEncoder).Settings.UseTiles = true;
            (encoder as Vintasoft.Imaging.Codecs.Encoders.TiffEncoder).Settings.TileSize = new System.Drawing.Size(512, 512);
        }
    
        // create file
        using (System.IO.Stream stream = new System.IO.FileStream(filename,
            System.IO.FileMode.Create, System.IO.FileAccess.ReadWrite))
        {
            // if encoder is multipage
            if (encoder is Vintasoft.Imaging.Codecs.Encoders.MultipageEncoderBase)
            {
                // save all images
                (encoder as Vintasoft.Imaging.Codecs.Encoders.MultipageEncoderBase).SaveImages(images, stream);
            }
            else
            {
                // check if there is exactly 1 image
                if (images.Count != 1)
                    throw new System.Exception("Single-page encoder cannot be used for saving multiple images.");
    
                encoder.SaveImage(images[0], stream);
            }
        }
    }
    
    ''' <summary>
    ''' Gets an encoder by the filename extension,
    ''' changes settings of the encoder and
    ''' saves an image collection to a file using encoder.
    ''' </summary>
    Public Shared Sub ChangeEncoderSettingsAndSave(images As Vintasoft.Imaging.ImageCollection, filename As String)
        ' get an encoder by the filename extension
        Dim encoder As Vintasoft.Imaging.Codecs.Encoders.EncoderBase = Vintasoft.Imaging.Codecs.Encoders.AvailableEncoders.CreateEncoder(filename)
        ' if encoder was not found
        If encoder Is Nothing Then
            Throw New System.Exception("Encoder is not found for specified file extension.")
        End If
        ' if encoder is TIFF
        If TypeOf encoder Is Vintasoft.Imaging.Codecs.Encoders.TiffEncoder Then
            ' specify that encoded image must be divided into tiles with size 512x512
            TryCast(encoder, Vintasoft.Imaging.Codecs.Encoders.TiffEncoder).Settings.UseTiles = True
            TryCast(encoder, Vintasoft.Imaging.Codecs.Encoders.TiffEncoder).Settings.TileSize = New System.Drawing.Size(512, 512)
        End If
    
        ' create file
        Using stream As System.IO.Stream = New System.IO.FileStream(filename, System.IO.FileMode.Create, System.IO.FileAccess.ReadWrite)
            ' if encoder is multipage
            If TypeOf encoder Is Vintasoft.Imaging.Codecs.Encoders.MultipageEncoderBase Then
                ' save all images
                TryCast(encoder, Vintasoft.Imaging.Codecs.Encoders.MultipageEncoderBase).SaveImages(images, stream)
            Else
                ' check if there is exactly 1 image
                If images.Count <> 1 Then
                    Throw New System.Exception("Single-page encoder cannot be used for saving multiple images.")
                End If
    
                encoder.SaveImage(images(0), stream)
            End If
        End Using
    End Sub
    



    4. Image file hierarchy

    ImageFile hierarchy provides a set of classes for parsing, decoding and encoding image files.

    The following diagram illustrates the logical links among basic classes of ImageFile architecture:


    4.1. Image file

    ImageFileBase<T> class is a base class for:
    The classes derived from ImageFileBase<T> provides access to a collection of file pages (or a page in case of single-page format) and general information about the file. They also implement functions of parsing, saving changes, saving to new source and packing the file.


    4.2. Image page

    Abstract ImagePage class defines methods, which allow to obtain information about encoded image (height, width, palette, resolution, etc) and encode image.
    Classes TiffPage, PngPage, BmpPage, DibPage, GifPage, IconPage, JpegPage, Jpeg2000Page, Jbig2Page, RawImagePageBase, which are derived from ImagePage class, also provides additional information about image: color space, compression, thumbnail and other format specific details.


    4.3. Image file block

    Each image file consists from file blocks. An abstract ImageFileBlock class describes a data block in file.
    All file blocks have the following common attributes:

    Block can be virtual (ImageFileBlock.IsVirtual, i.e. created in memory without link to the real source (ImageFileSource). Virtual blocks appear when new file is created or new blocks are added to existing file. Blocks become real after saving the file to the source.
    The overriden abstract method ImageFileBlock.Parse allows to implement the parsing algorithm for the specific block. The overriden abstract method ImageFileBlock.Write allows to implement the writing of encoded data into the source.


    4.4. Image file source

    ImageFileSource class allows to read/write data from/to the source. The class implements a wide range of data read/write functions for different data formats: Int16, Uint16, Int32, UInt32, Int64, UInt64, Char, Bool, Single, Double, Byte, Byte[]. The ImageFileSource class implements read/write operations in little-endian format. The BigEndianImageSource class implements read/write operations in big-endian format.