VintaSoft Imaging .NET SDK 12.4: Documentation for .NET developer
In This Topic
    Undo/redo changes in images
    In This Topic
    SDK has the open architecture for undo/redo changes in images, annotations and user defined objects.
    Architecture contains 3 main classes:

    Class UndoAction allows to:

    Class UndoManager allows to:

    Here is a list of standard undo monitors:
    Here is C#/VB.NET code that demonstrates how to process an image and undo changes in image:
    /// <summary>
    /// This example demonstrates how to process an image and undo changes in image.
    /// </summary>
    public static void ImageUndoManagerExample()
    {
        // create an image collection
        Vintasoft.Imaging.ImageCollection images =
            new Vintasoft.Imaging.ImageCollection();
        // add image to the image collection
        images.Add(@"..\..\Resources\Image.png");
    
        Vintasoft.Imaging.VintasoftImage image = images[0];
    
        // show information about image
        ShowInfo(image);
    
    
        // create an instance of undo manager
        Vintasoft.Imaging.Undo.UndoManager undoManager =
            new Vintasoft.Imaging.Undo.UndoManager();
    
        // create the image resize command
        Vintasoft.Imaging.ImageProcessing.ResizeCommand resizeCommand =
            new Vintasoft.Imaging.ImageProcessing.ResizeCommand();
        // create the undo monitor for the image resize command
        using (Vintasoft.Imaging.Undo.UndoMonitor resizeCommandUndoMonitor =
            new Vintasoft.Imaging.Undo.ImageProcessingUndoMonitor(undoManager, resizeCommand))
        {
            // create the image change pixel format command
            Vintasoft.Imaging.ImageProcessing.ChangePixelFormatCommand changePixelFormatCommand =
                new Vintasoft.Imaging.ImageProcessing.ChangePixelFormatCommand();
            // create the undo manager for image change pixel format command
            using (Vintasoft.Imaging.Undo.UndoMonitor changePixelFormatCommandUndoMonitor =
                new Vintasoft.Imaging.Undo.ImageProcessingUndoMonitor(undoManager, changePixelFormatCommand))
            {
                // Step 1: change pixel format to grayscale
                changePixelFormatCommand.PixelFormat = Vintasoft.Imaging.PixelFormat.Gray8;
                changePixelFormatCommand.ExecuteInPlace(image);
    
                // show information about image
                ShowInfo(image);
    
                // undo one step (Step 1)
                undoManager.Undo(1);
    
                // show information about image
                ShowInfo(image);
    
    
                // Step 2: resize image
                resizeCommand.Width = 750;
                resizeCommand.Height = 350;
                resizeCommand.ExecuteInPlace(image);
    
                // show information about image
                ShowInfo(image);
    
    
                // Step 3: change pixel format to Bgr48
                changePixelFormatCommand.PixelFormat = Vintasoft.Imaging.PixelFormat.Bgr48;
                changePixelFormatCommand.ExecuteInPlace(image);
    
                // show information about image
                ShowInfo(image);
    
                // undo two steps (Step 3 and Step 2)
                undoManager.Undo(2);
    
                // show information about image
                ShowInfo(image);
    
                // redo one step (Step 2)
                undoManager.Redo(1);
    
                // show information about image
                ShowInfo(image);
            }
        }
    }
    
    /// <summary>
    /// Shows information about image.
    /// </summary>
    /// <param name="image">Image.</param>
    public static void ShowInfo(
        Vintasoft.Imaging.VintasoftImage image)
    {
        // show information about image
        System.Console.WriteLine("Image: {0}x{1} PixelFormat:{2}", image.Width, image.Height, image.PixelFormat);
    }
    
    /* This code example produces the following output:
    
    Image: 500x534 PixelFormat:Bgr24
    Image: 500x534 PixelFormat:Gray8
    Image: 500x534 PixelFormat:Bgr24
    Image: 750x350 PixelFormat:Bgr24
    Image: 750x350 PixelFormat:Bgr48
    Image: 500x534 PixelFormat:Bgr24
    Image: 750x350 PixelFormat:Bgr24
    */
    
    
            ''' <summary>
            ''' This example demonstrates how to process an image and undo changes in image.
            ''' </summary>
            Public Shared Sub ImageUndoManagerExample()
                ' create an image collection
                Dim images As New Vintasoft.Imaging.ImageCollection()
                ' add image to the image collection
                images.Add("..\..\Resources\Image.png")
    
                Dim image As Vintasoft.Imaging.VintasoftImage = images(0)
    
                ' show information about image
                ShowInfo(image)
    
    
                ' create an instance of undo manager
                Dim undoManager As New Vintasoft.Imaging.Undo.UndoManager()
    
                ' create the image resize command
                Dim resizeCommand As New Vintasoft.Imaging.ImageProcessing.ResizeCommand()
                ' create the undo monitor for the image resize command
                Using resizeCommandUndoMonitor As Vintasoft.Imaging.Undo.UndoMonitor = New Vintasoft.Imaging.Undo.ImageProcessingUndoMonitor(undoManager, resizeCommand)
                    ' create the image change pixel format command
                    Dim changePixelFormatCommand As New Vintasoft.Imaging.ImageProcessing.ChangePixelFormatCommand()
                    ' create the undo manager for image change pixel format command
                    Using changePixelFormatCommandUndoMonitor As Vintasoft.Imaging.Undo.UndoMonitor = New Vintasoft.Imaging.Undo.ImageProcessingUndoMonitor(undoManager, changePixelFormatCommand)
                        ' Step 1: change pixel format to grayscale
                        changePixelFormatCommand.PixelFormat = Vintasoft.Imaging.PixelFormat.Gray8
                        changePixelFormatCommand.ExecuteInPlace(image)
    
                        ' show information about image
                        ShowInfo(image)
    
                        ' undo one step (Step 1)
                        undoManager.Undo(1)
    
                        ' show information about image
                        ShowInfo(image)
    
    
                        ' Step 2: resize image
                        resizeCommand.Width = 750
                        resizeCommand.Height = 350
                        resizeCommand.ExecuteInPlace(image)
    
                        ' show information about image
                        ShowInfo(image)
    
    
                        ' Step 3: change pixel format to Bgr48
                        changePixelFormatCommand.PixelFormat = Vintasoft.Imaging.PixelFormat.Bgr48
                        changePixelFormatCommand.ExecuteInPlace(image)
    
                        ' show information about image
                        ShowInfo(image)
    
                        ' undo two steps (Step 3 and Step 2)
                        undoManager.Undo(2)
    
                        ' show information about image
                        ShowInfo(image)
    
                        ' redo one step (Step 2)
                        undoManager.Redo(1)
    
                        ' show information about image
                        ShowInfo(image)
                    End Using
                End Using
            End Sub
    
            ''' <summary>
            ''' Shows information about image.
            ''' </summary>
            ''' <param name="image">Image.</param>
            Public Shared Sub ShowInfo(image As Vintasoft.Imaging.VintasoftImage)
                ' show information about image
                System.Console.WriteLine("Image: {0}x{1} PixelFormat:{2}", image.Width, image.Height, image.PixelFormat)
            End Sub
    
            ' This code example produces the following output:
    '
    '        Image: 500x534 PixelFormat:Bgr24
    '        Image: 500x534 PixelFormat:Gray8
    '        Image: 500x534 PixelFormat:Bgr24
    '        Image: 750x350 PixelFormat:Bgr24
    '        Image: 750x350 PixelFormat:Bgr48
    '        Image: 500x534 PixelFormat:Bgr24
    '        Image: 750x350 PixelFormat:Bgr24
    '
    
    
    



    Here is C#/VB.NET code that demonstrates how to process an image with annotations and undo changes in image and annotations:
    /// <summary>
    /// This example demonstrates how to process an image with annotations and undo changes in image and annotations.
    /// </summary>
    public void ImageAndAnnotationsUndoManagerExample()
    {
        // create an image collection
        Vintasoft.Imaging.ImageCollection images =
            new Vintasoft.Imaging.ImageCollection();
        // add image to the image collection
        images.Add(@"..\..\Resources\Image.png");
    
        Vintasoft.Imaging.VintasoftImage image = images[0];
    
        // create the annotation data controller for image collection
        Vintasoft.Imaging.Annotation.AnnotationDataController annotationDataController =
            new Vintasoft.Imaging.Annotation.AnnotationDataController(images);
    
        // get reference to the annotation data collection of image
        Vintasoft.Imaging.Annotation.AnnotationDataCollection annotationDataCollection =
            annotationDataController.GetAnnotations(image);
        // get reference to the annotation view collection of image
        Vintasoft.Imaging.Annotation.UI.AnnotationViewCollection annotationViewCollection =
            new Vintasoft.Imaging.Annotation.UI.AnnotationViewCollection(annotationDataCollection);
    
        // show information about image and annotations
        ShowInfo(image, annotationDataCollection);
    
    
        // create an instance of undo manager
        Vintasoft.Imaging.Undo.UndoManager undoManager =
            new Vintasoft.Imaging.Undo.UndoManager();
    
        // create the image resize command
        Vintasoft.Imaging.ImageProcessing.ResizeCommand resizeCommand =
            new Vintasoft.Imaging.ImageProcessing.ResizeCommand();
        // create the undo monitor for the image resize command
        using (Vintasoft.Imaging.Undo.UndoMonitor resizeCommandUndoMonitor =
            new Vintasoft.Imaging.Undo.ImageProcessingUndoMonitor(undoManager, resizeCommand))
        {
            // create the undo monitor for annotations
            using (Vintasoft.Imaging.Undo.UndoMonitor annotationUndoMonitor =
                new Vintasoft.Imaging.Annotation.UI.Undo.AnnotationViewCollectionUndoMonitor(
                    undoManager, annotationViewCollection))
            {
                // Step 1
    
                // create a rectangle annotation
                Vintasoft.Imaging.Annotation.RectangleAnnotationData rectangleAnnotationData =
                    new Vintasoft.Imaging.Annotation.RectangleAnnotationData();
                rectangleAnnotationData.Location = new System.Drawing.PointF(60, 110);
                rectangleAnnotationData.Size = new System.Drawing.SizeF(100, 38);
                // add the rectangle annotation to the image
                annotationDataCollection.Add(rectangleAnnotationData);
    
                // show information about image and annotations
                ShowInfo(image, annotationDataCollection);
    
                // undo one step (Step 1)
                undoManager.Undo(1);
    
                // show information about image and annotations
                ShowInfo(image, annotationDataCollection);
    
    
                // Step 2: resize image
                resizeCommand.Width = 550;
                resizeCommand.Height = 450;
                resizeCommand.ExecuteInPlace(image);
    
                // show information about image and annotations
                ShowInfo(image, annotationDataCollection);
    
    
                // Step 3
    
                // change an existing annotation
                Vintasoft.Imaging.Annotation.AnnotationData annotationData = annotationDataCollection[0];
                annotationData.Location = new System.Drawing.PointF(15, 10);
    
                // show information about image and annotations
                ShowInfo(image, annotationDataCollection);
    
                // undo two steps (Step 3 and Step 2)
                undoManager.Undo(2);
    
                // show information about image and annotations
                ShowInfo(image, annotationDataCollection);
    
    
                // redo one step (Step 2)
                undoManager.Redo(1);
    
                // show information about image and annotations
                ShowInfo(image, annotationDataCollection);
            }
        }
    }
    
    /// <summary>
    /// Shows information about image and annotations.
    /// </summary>
    /// <param name="image">Image.</param>
    /// <param name="annotationDataCollection">Annotation data collection.</param>
    public void ShowInfo(
        Vintasoft.Imaging.VintasoftImage image,
        Vintasoft.Imaging.Annotation.AnnotationDataCollection annotationDataCollection)
    {
        // show information about image
        System.Console.WriteLine("Image: {0}x{1} PixelFormat:{2}", image.Width, image.Height, image.PixelFormat);
    
        // show information about annotations
        System.Console.WriteLine("Annotation count: {0}", annotationDataCollection.Count);
        foreach (Vintasoft.Imaging.Annotation.AnnotationData annotationData in annotationDataCollection)
        {
            System.Type annotationDataType = annotationData.GetType();
            System.Console.WriteLine("\tType:{0} Location:{1} Size:{2}", annotationDataType.Name,
                annotationData.Location, annotationData.Size);
        }
    }
    
    /* This code example produces the following output:
    
    Image: 500x418 PixelFormat:Bgr24
    Annotations count: 2
            Type:PolygonAnnotationData Location:{X=26,00019, Y=22,55438} Size:{Width=60,77151, Height=61,08478}
            Type:LineAnnotationData Location:{X=114,9647, Y=15,34951} Size:{Width=0, Height=104,6273}
    Image: 500x418 PixelFormat:Bgr24
    Annotations count: 3
            Type:PolygonAnnotationData Location:{X=26,00019, Y=22,55438} Size:{Width=60,77151, Height=61,08478}
            Type:LineAnnotationData Location:{X=114,9647, Y=15,34951} Size:{Width=0, Height=104,6273}
            Type:RectangleAnnotationData Location:{X=60, Y=110} Size:{Width=100, Height=38}
    Image: 500x418 PixelFormat:Bgr24
    Annotations count: 2
            Type:PolygonAnnotationData Location:{X=26,00019, Y=22,55438} Size:{Width=60,77151, Height=61,08478}
            Type:LineAnnotationData Location:{X=114,9647, Y=15,34951} Size:{Width=0, Height=104,6273}
    Image: 550x450 PixelFormat:Bgr24
    Annotations count: 2
            Type:PolygonAnnotationData Location:{X=26,00019, Y=22,55438} Size:{Width=60,77151, Height=61,08478}
            Type:LineAnnotationData Location:{X=114,9647, Y=15,34951} Size:{Width=0, Height=104,6273}
    Image: 500x418 PixelFormat:Bgr24
    Annotations count: 2
            Type:PolygonAnnotationData Location:{X=26,00019, Y=22,55438} Size:{Width=60,77151, Height=61,08478}
            Type:LineAnnotationData Location:{X=114,9647, Y=15,34951} Size:{Width=0, Height=104,6273}
    Image: 550x450 PixelFormat:Bgr24
    Annotations count: 2
            Type:PolygonAnnotationData Location:{X=26,00019, Y=22,55438} Size:{Width=60,77151, Height=61,08478}
            Type:LineAnnotationData Location:{X=114,9647, Y=15,34951} Size:{Width=0, Height=104,6273}
    */
    
    
            ''' <summary>
            ''' This example demonstrates how to process an image with annotations and undo changes in image and annotations.
            ''' </summary>
            Public Sub ImageAndAnnotationsUndoManagerExample()
                ' create an image collection
                Dim images As New Vintasoft.Imaging.ImageCollection()
                ' add image to the image collection
                images.Add("..\..\Resources\Image.png")
    
                Dim image As Vintasoft.Imaging.VintasoftImage = images(0)
    
                ' create the annotation data controller for image collection
                Dim annotationDataController As New Vintasoft.Imaging.Annotation.AnnotationDataController(images)
    
                ' get reference to the annotation data collection of image
                Dim annotationDataCollection As Vintasoft.Imaging.Annotation.AnnotationDataCollection = annotationDataController.GetAnnotations(image)
                ' get reference to the annotation view collection of image
                Dim annotationViewCollection As New Vintasoft.Imaging.Annotation.UI.AnnotationViewCollection(annotationDataCollection)
    
                ' show information about image and annotations
                ShowInfo(image, annotationDataCollection)
    
    
                ' create an instance of undo manager
                Dim undoManager As New Vintasoft.Imaging.Undo.UndoManager()
    
                ' create the image resize command
                Dim resizeCommand As New Vintasoft.Imaging.ImageProcessing.ResizeCommand()
                ' create the undo monitor for the image resize command
                Using resizeCommandUndoMonitor As Vintasoft.Imaging.Undo.UndoMonitor = New Vintasoft.Imaging.Undo.ImageProcessingUndoMonitor(undoManager, resizeCommand)
                    ' create the undo monitor for annotations
                    Using annotationUndoMonitor As Vintasoft.Imaging.Undo.UndoMonitor = New Vintasoft.Imaging.Annotation.UI.Undo.AnnotationViewCollectionUndoMonitor(undoManager, annotationViewCollection)
                        ' Step 1
    
                        ' create a rectangle annotation
                        Dim rectangleAnnotationData As New Vintasoft.Imaging.Annotation.RectangleAnnotationData()
                        rectangleAnnotationData.Location = New System.Drawing.PointF(60, 110)
                        rectangleAnnotationData.Size = New System.Drawing.SizeF(100, 38)
                        ' add the rectangle annotation to the image
                        annotationDataCollection.Add(rectangleAnnotationData)
    
                        ' show information about image and annotations
                        ShowInfo(image, annotationDataCollection)
    
                        ' undo one step (Step 1)
                        undoManager.Undo(1)
    
                        ' show information about image and annotations
                        ShowInfo(image, annotationDataCollection)
    
    
                        ' Step 2: resize image
                        resizeCommand.Width = 550
                        resizeCommand.Height = 450
                        resizeCommand.ExecuteInPlace(image)
    
                        ' show information about image and annotations
                        ShowInfo(image, annotationDataCollection)
    
    
                        ' Step 3
    
                        ' change an existing annotation
                        Dim annotationData As Vintasoft.Imaging.Annotation.AnnotationData = annotationDataCollection(0)
                        annotationData.Location = New System.Drawing.PointF(15, 10)
    
                        ' show information about image and annotations
                        ShowInfo(image, annotationDataCollection)
    
                        ' undo two steps (Step 3 and Step 2)
                        undoManager.Undo(2)
    
                        ' show information about image and annotations
                        ShowInfo(image, annotationDataCollection)
    
    
                        ' redo one step (Step 2)
                        undoManager.Redo(1)
    
                        ' show information about image and annotations
                        ShowInfo(image, annotationDataCollection)
                    End Using
                End Using
            End Sub
    
            ''' <summary>
            ''' Shows information about image and annotations.
            ''' </summary>
            ''' <param name="image">Image.</param>
            ''' <param name="annotationDataCollection">Annotation data collection.</param>
            Public Sub ShowInfo(image As Vintasoft.Imaging.VintasoftImage, annotationDataCollection As Vintasoft.Imaging.Annotation.AnnotationDataCollection)
                ' show information about image
                System.Console.WriteLine("Image: {0}x{1} PixelFormat:{2}", image.Width, image.Height, image.PixelFormat)
    
                ' show information about annotations
                System.Console.WriteLine("Annotation count: {0}", annotationDataCollection.Count)
                For Each annotationData As Vintasoft.Imaging.Annotation.AnnotationData In annotationDataCollection
                    Dim annotationDataType As System.Type = annotationData.[GetType]()
                    System.Console.WriteLine(vbTab & "Type:{0} Location:{1} Size:{2}", annotationDataType.Name, annotationData.Location, annotationData.Size)
                Next
            End Sub
    
            ' This code example produces the following output:
    '
    '        Image: 500x418 PixelFormat:Bgr24
    '        Annotations count: 2
    '                Type:PolygonAnnotationData Location:{X=26,00019, Y=22,55438} Size:{Width=60,77151, Height=61,08478}
    '                Type:LineAnnotationData Location:{X=114,9647, Y=15,34951} Size:{Width=0, Height=104,6273}
    '        Image: 500x418 PixelFormat:Bgr24
    '        Annotations count: 3
    '                Type:PolygonAnnotationData Location:{X=26,00019, Y=22,55438} Size:{Width=60,77151, Height=61,08478}
    '                Type:LineAnnotationData Location:{X=114,9647, Y=15,34951} Size:{Width=0, Height=104,6273}
    '                Type:RectangleAnnotationData Location:{X=60, Y=110} Size:{Width=100, Height=38}
    '        Image: 500x418 PixelFormat:Bgr24
    '        Annotations count: 2
    '                Type:PolygonAnnotationData Location:{X=26,00019, Y=22,55438} Size:{Width=60,77151, Height=61,08478}
    '                Type:LineAnnotationData Location:{X=114,9647, Y=15,34951} Size:{Width=0, Height=104,6273}
    '        Image: 550x450 PixelFormat:Bgr24
    '        Annotations count: 2
    '                Type:PolygonAnnotationData Location:{X=26,00019, Y=22,55438} Size:{Width=60,77151, Height=61,08478}
    '                Type:LineAnnotationData Location:{X=114,9647, Y=15,34951} Size:{Width=0, Height=104,6273}
    '        Image: 500x418 PixelFormat:Bgr24
    '        Annotations count: 2
    '                Type:PolygonAnnotationData Location:{X=26,00019, Y=22,55438} Size:{Width=60,77151, Height=61,08478}
    '                Type:LineAnnotationData Location:{X=114,9647, Y=15,34951} Size:{Width=0, Height=104,6273}
    '        Image: 550x450 PixelFormat:Bgr24
    '        Annotations count: 2
    '                Type:PolygonAnnotationData Location:{X=26,00019, Y=22,55438} Size:{Width=60,77151, Height=61,08478}
    '                Type:LineAnnotationData Location:{X=114,9647, Y=15,34951} Size:{Width=0, Height=104,6273}
    '