В этом разделе
Класс
AnnotationData предназначен для хранения базовой информации об аннотации. Полная информация об аннотации хранится в классе, производном от класса
AnnotationData.
Аннотации, производные от класса
AnnotationData, делятся на 3 типа:
-
Аннотации на основе прямоугольника (производные от класса RectangleAnnotationData):
- RectangleAnnotationData - содержит информацию об аннотации, отображающей прямоугольник.
- EllipseAnnotationData - содержит информацию об аннотации, отображающей эллипс.
- EmbeddedImageAnnotationData - содержит информацию об аннотации, отображающей внедренное изображение.
- ReferencedImageAnnotationData - содержит информацию об аннотации, отображающей ссылочное изображение.
- HighlightAnnotationData - содержит информацию об аннотации, которая подсвечивает область на изображении.
- TextAnnotationData - содержит информацию об аннотации, отображающей текст, который может редактировать пользователь.
- LinkAnnotationData - содержит информацию об аннотации, отображающей гипертекстовую ссылку.
- StampAnnotationData - содержит информацию о аннотации, которая отображает текстовое сообщение с прямоугольником со скругленными углами, похожим на резиновый штамп.
-
Аннотации на основе набора точек (производный от класса LineAnnotationDataBase):
-
Составные аннотации (полученные из класса CompositeAnnotationData). Эти аннотации объединяют несколько аннотаций любого типа.
- FreeTextAnnotationData - содержит информацию о аннотации, которая отображает редактируемую текстовую область и направляющую полилинию, используемую для указания на регион изображения.
- GroupAnnotationData - содержит информацию об аннотации, отображающей группу аннотаций.
Расположение аннотации
Свойство
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.Guid, AnnotationData.Name
- дата-время/автор/изменения: AnnotationData.CreationTime, AnnotationData.ModifiedTime, AnnotationData.CreatedBy, AnnotationData.ModifiedBy
- расположение/размер/поворот: AnnotationData.Location, AnnotationData.Size, AnnotationData.Rotation
- внешний вид: AnnotationData.Border, AnnotationData.Outline, AnnotationData.FillBrush, AnnotationData.ToolTip
- видимость: AnnotationData.IsVisible
- преобразование: AnnotationData.HorizontalMirrored, AnnotationData.VerticalMirrored, AnnotationData.Resizeable, AnnotationData.Rotatable, AnnotationData.CanMove, AnnotationData.CanRotate, AnnotationData.CanResize, AnnotationData.CanMirror
Классы, производные от класса
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 в массив, подписываться на события изменения/изменения свойств каждой аннотации.