VintaSoft Imaging .NET SDK 14.0: Документация для .NET разработчика
В этом разделе
    Данные аннотации
    В этом разделе
    Класс AnnotationData предназначен для хранения базовой информации об аннотации. Полная информация об аннотации хранится в классе, производном от класса AnnotationData.

    Аннотации, производные от класса AnnotationData, делятся на 3 типа:

    Расположение аннотации

    Свойство AnnotationData.Location позволяет получить/установить местоположение аннотации.

    Расположение для аннотации на основе прямоугольника всегда совпадает с центром прямоугольника аннотации.
    Расположение для точечной аннотации по умолчанию совпадает с ее первой точкой, если не изменены координаты первой точки.

    Расположение указывается и сохраняется в системе координат изображения с началом координат в левом верхнем углу. Единица измерения - 1 DIP (независимый от устройства пиксель), что соответствует 1/96 дюйма.


    Размер аннотации

    Свойство AnnotationData.Size позволяет получить/установить размер аннотации.

    Размер указывается и сохраняется в системе координат изображения с началом координат в левом верхнем углу. Единица измерения - 1 DIP (независимый от устройства пиксель), что соответствует 1/96 дюйма.


    Угол поворота аннотации и центр вращения

    Свойство AnnotationData.Rotation позволяет получить/установить поворот аннотации в градусах.

    Центр вращения аннотации - это точка в системе координат изображения, относительно которой аннотация поворачивается при изменении значения свойства AnnotationData.Rotation.
    Центр вращения любой аннотации можно рассчитать следующим образом:
    Угол поворота аннотации - это угол отклонения от нормального не повернутого состояния аннотации. Он указывается и сохраняется в градусах. Угол поворота имеет положительное значение, когда аннотация вращается по часовой стрелке, и отрицательное, когда против часовой стрелки.


    Ограничивающий прямоугольник аннотации

    Ограничивающий прямоугольник аннотации - это минимальный прямоугольник, который включает в себя аннотацию целиком и стороны которого параллельны сторонам изображения.
    Для аннотаций на основе прямоугольников ограничивающим прямоугольником является минимальный прямоугольник, который включает в себя все вершины прямоугольника аннотации, а его центр всегда совпадает с центром прямоугольника аннотации.
    Для аннотаций на основе точек ограничивающим прямоугольником является минимальный прямоугольник, который включает в себя все точки аннотации.

    AnnotationData.GetBoundingBox метод вычисляет ограничивающий прямоугольник аннотации.
    Вот C#/VB.NET код, который демонстрирует, как проверить, находится ли аннотация внутри границ изображения:
    bool IsAnnotationInsideImage(
        Vintasoft.Imaging.Annotation.AnnotationData annotation, 
        Vintasoft.Imaging.VintasoftImage image)
    {
        // get the bounding box
        System.Drawing.RectangleF boundingBox = annotation.GetBoundingBox();
        // calculate image size in device independent pixels
        float imageWidthInDips = image.Width * 96f / (float)image.Resolution.Horizontal;
        float imageHeightInDips = image.Height * 96f / (float)image.Resolution.Vertical;
        System.Drawing.RectangleF imageRect = 
            new System.Drawing.RectangleF(0, 0, imageWidthInDips, imageHeightInDips);
        // check if image rectangle contains the bounding box
        return imageRect.Contains(boundingBox);
    }
    
    Private Function IsAnnotationInsideImage(annotation As Vintasoft.Imaging.Annotation.AnnotationData, image As Vintasoft.Imaging.VintasoftImage) As Boolean
        ' get the bounding box
        Dim boundingBox As System.Drawing.RectangleF = annotation.GetBoundingBox()
        ' calculate image size in device independent pixels
        Dim imageWidthInDips As Single = image.Width * 96F / CSng(image.Resolution.Horizontal)
        Dim imageHeightInDips As Single = image.Height * 96F / CSng(image.Resolution.Vertical)
        Dim imageRect As New System.Drawing.RectangleF(0, 0, imageWidthInDips, imageHeightInDips)
        ' check if image rectangle contains the bounding box
        Return imageRect.Contains(boundingBox)
    End Function
    

    "AnnotationData.GetBoundingBox(PointF location, SizeF size, float rotation)" метод вычисляет ограничивающий прямоугольник, который будет иметь аннотация, с параметрами местоположения, размера и вращения, передаваемыми в качестве аргументов метода.
    Вот C#/VB.NET код, который демонстрирует, как ограничить угол поворота аннотации, чтобы она не выходила за границы указанной области:
    System.Drawing.RectangleF _boundingArea;
    Vintasoft.Imaging.Annotation.AnnotationData _annotation;
    
    void SubscribeOnPropertyChanging()
    {
        _annotation.PropertyChanging += 
            new System.EventHandler<Vintasoft.Imaging.ObjectPropertyChangingEventArgs>(annotation_PropertyChanging);
    }
    
    void annotation_PropertyChanging(object sender, Vintasoft.Imaging.ObjectPropertyChangingEventArgs e)
    {
        if (e.PropertyName == "Rotation")
        {
            System.Drawing.RectangleF boundingBox = _annotation.GetBoundingBox(
                _annotation.Location, _annotation.Size, (float)e.NewValue);
    
            if (!_boundingArea.Contains(boundingBox))
            {
                e.Cancel = true;
            }
        }
    }
    
    Private _boundingArea As System.Drawing.RectangleF
    Private _annotation As Vintasoft.Imaging.Annotation.AnnotationData
    
    Private Sub SubscribeOnPropertyChanging()
        AddHandler _annotation.PropertyChanging, New System.EventHandler(Of Vintasoft.Imaging.ObjectPropertyChangingEventArgs)(AddressOf annotation_PropertyChanging)
    End Sub
    
    Private Sub annotation_PropertyChanging(sender As Object, e As Vintasoft.Imaging.ObjectPropertyChangingEventArgs)
        If e.PropertyName = "Rotation" Then
            Dim boundingBox As System.Drawing.RectangleF = _annotation.GetBoundingBox(_annotation.Location, _annotation.Size, CSng(e.NewValue))
    
            If Not _boundingArea.Contains(boundingBox) Then
                e.Cancel = True
            End If
        End If
    End Sub
    


    Свойства аннотации

    Класс AnnotationData содержит набор свойств, разделенных на следующие группы: Классы, производные от класса AnnotationData, имеют дополнительные свойства, которые определяют данные аннотации. Например, класс LineAnnotationDataBase имеет свойство Points, которое содержит информацию о точках аннотации.


    Добавление комментария к аннотации

    Каждую аннотацию можно прокомментировать. Свойство AnnotationData.Comment возвращает корневой комментарий для аннотации (экземпляр класса AnnotationComment). Свойство AnnotationComment.Replies возвращает коллекцию комментариев (экземпляр класса CommentCollection), содержащую ответы на комментарий.


    Отслеживание изменений свойств аннотации

    Класс AnnotationData предоставляет события, которые позволяют отслеживать изменения свойств аннотации:

    Загрузка и сохранение аннотации

    Класс AnnotationData реализует интерфейс ISerializable. Это позволяет загружать/сохранять аннотации с помощью любого форматтера, реализующего интерфейс IFormatter.


    Инициализация свойств аннотации

    Класс AnnotationData реализует интерфейс ISupportInitialize.

    Метод AnnotationData.BeginInit позволяет начать инициализацию свойств аннотации. AnnotationData.BeginInit вызывает событие AnnotationData.PropertyChanged со следующими свойствами: PropertyName="IsInitializing", NewValue=True.

    Метод AnnotationData.EndInit позволяет остановить инициализацию свойств аннотации. AnnotationData.BeginInit вызывает событие AnnotationData.PropertyChanged со следующими свойствами: PropertyName="IsInitializing", NewValue=False.

    Методы AnnotationData.BeginInit и AnnotationData.EndInit просто генерируют дополнительные события AnnotationData.PropertyChanged и не меняют логику вызова событий AnnotationData.PropertyChanging и AnnotationData.PropertyChanged аннотации.
    Методы AnnotationData.BeginInit и AnnotationData.EndInit могут быть вложенными.


    Клонирование аннотации

    Класс AnnotationData реализует интерфейс ICloneable.

    Вот C#/VB.NET код, который демонстрирует, как склонировать одну аннотацию из коллекции и добавить клонированную аннотацию в ту же коллекцию:
    void CloneAndAdd(Vintasoft.Imaging.Annotation.AnnotationDataCollection annotationCollection, int index)
    {
        // clone annotation at specified index
        Vintasoft.Imaging.Annotation.AnnotationData clonedAnnotation = 
            (Vintasoft.Imaging.Annotation.AnnotationData)annotationCollection[index].Clone();
        // add cloned annotation to the end of the collection
        annotationCollection.Add(clonedAnnotation);
    }
    
    Private Sub CloneAndAdd(annotationCollection As Vintasoft.Imaging.Annotation.AnnotationDataCollection, index As Integer)
        ' clone annotation at specified index
        Dim clonedAnnotation As Vintasoft.Imaging.Annotation.AnnotationData = DirectCast(annotationCollection(index).Clone(), Vintasoft.Imaging.Annotation.AnnotationData)
        ' add cloned annotation to the end of the collection
        annotationCollection.Add(clonedAnnotation)
    End Sub
    


    Коллекция аннотаций

    Класс AnnotationDataCollection представляет собой коллекцию экземпляров класса AnnotationData. Класс AnnotationDataCollection предоставляет возможность добавлять, удалять, переупорядочивать, сортировать элементы, преобразовывать элементы AnnotationData в массив, подписываться на события изменения/изменения свойств каждой аннотации.