В этом разделе
Предоставляет абстрактный базовый класс для статических графических объектов, которые могут отображаться в просмотрщике изображений.
Объектная модель
Синтаксис
Ремарки
По умолчанию координатное пространство объекта равно координатному пространству просмотрщика изображений, т. е. точка объекта с координатой (0;0) совпадает с левой верхней точкой просмотрщика изображений.
Координатное пространство объекта можно изменить с помощью свойства PointTransform. Пример, показывающий, как создать статический прямоугольник, координаты которого совпадают с координатами изображения, можно найти в разделе Примеры.
Пример
Вот C#/VB.NET код, который демонстрирует, как создать сетку поверх изображения в просмотрщике изображений:
''' <summary>
''' Displays grid over image in image viewer.
''' </summary>
''' <param name="viewer">The viewer.</param>
Public Shared Sub DrawGridOverImageInImageViewer(viewer As Vintasoft.Imaging.UI.ImageViewer)
' create visual tool that can display static graphic objects in an image viewer
Dim tool As New Vintasoft.Imaging.UI.VisualTools.GraphicObjects.GraphicObjectTool()
' create graphic object that displays image grid
Dim grid As New GridGraphicObject(tool)
' add graphic object to the visual tool
tool.GraphicObjectCollection.Add(grid)
' set visual tool as current visual tool of image viewer
viewer.VisualTool = tool
End Sub
''' <summary>
''' Represents an image grid which can be displayed in image viewer.
''' </summary>
Public Class GridGraphicObject
Inherits Vintasoft.Imaging.UI.VisualTools.GraphicObjects.GraphicObject
#Region "Fields"
Private _tool As Vintasoft.Imaging.UI.VisualTools.VisualTool
#End Region
#Region "Constructors"
''' <summary>
''' Initializes a new instance of the <see cref="GridGraphicObject"/> class.
''' </summary>
''' <param name="tool">The visual tool.</param>
Public Sub New(tool As Vintasoft.Imaging.UI.VisualTools.VisualTool)
If tool Is Nothing Then
Throw New System.ArgumentNullException()
End If
_tool = tool
Pen = New System.Drawing.Pen(System.Drawing.Color.FromArgb(128, System.Drawing.Color.Lime), 1)
PointTransform = New Vintasoft.Imaging.UI.VisualTools.PixelsToImageViewerPointFTransform()
End Sub
#End Region
#Region "Properties"
Private _location As System.Drawing.PointF = System.Drawing.PointF.Empty
''' <summary>
''' Gets or sets the location of grid.
''' </summary>
''' <value>
''' Default value is <b>(0,0)</b>.
''' </value>
Public Property Location() As System.Drawing.PointF
Get
Return _location
End Get
Set
_location = value
End Set
End Property
Private _cellSize As New System.Drawing.SizeF(1, 1)
''' <summary>
''' Gets or sets the size of the grid cell.
''' </summary>
''' <value>
''' Default value is <b>(1,1)</b>.
''' </value>
Public Property CellSize() As System.Drawing.SizeF
Get
Return _cellSize
End Get
Set
_cellSize = value
End Set
End Property
Private _cellUnitOfMeasure As Vintasoft.Imaging.UnitOfMeasure = Vintasoft.Imaging.UnitOfMeasure.Centimeters
''' <summary>
''' Gets or sets the unit of measure of the grid cell.
''' </summary>
''' <value>
''' Default value is <b>UnitOfMeasure.Centimeters</b>.
''' </value>
Public Property CellUnitOfMeasure() As Vintasoft.Imaging.UnitOfMeasure
Get
Return _cellUnitOfMeasure
End Get
Set
_cellUnitOfMeasure = value
End Set
End Property
#End Region
#Region "Methods"
''' <summary>
''' Determines that point belongs the object.
''' </summary>
''' <param name="x">X coordinate of point in object space.</param>
''' <param name="y">Y coordinate of point in object space.</param>
''' <returns>
''' <b>true</b> if point belongs the object;
''' otherwise, <b>false</b>.
''' </returns>
Public Overrides Function IsPointOnObject(x As Single, y As Single) As Boolean
If _tool.ImageViewer.Image IsNot Nothing AndAlso (Pen IsNot Nothing OrElse Brush IsNot Nothing) Then
Dim rect As System.Drawing.RectangleF = GetRectangle(_location, _tool.ImageViewer.Image)
Return rect.Contains(x, y)
Else
Return False
End If
End Function
''' <summary>
''' Returns a bounding box of object, in object space.
''' </summary>
''' <returns>
''' Bounding box of object, in object space.
''' </returns>
Public Overrides Function GetBoundingBox() As System.Drawing.RectangleF
If _tool.ImageViewer.Image IsNot Nothing Then
Return GetRectangle(_location, _tool.ImageViewer.Image)
Else
Return System.Drawing.RectangleF.Empty
End If
End Function
''' <summary>
''' Returns a drawing rectangle of object, in object space.
''' </summary>
''' <param name="viewer">An image viewer.</param>
''' <returns>
''' Drawing rectangle of object, in object space.
''' </returns>
Public Overrides Function GetDrawingBox(viewer As Vintasoft.Imaging.UI.ImageViewer) As System.Drawing.RectangleF
If viewer.Image Is Nothing Then
Return System.Drawing.RectangleF.Empty
End If
Dim rect As System.Drawing.RectangleF = GetRectangle(_location, viewer.Image)
If Pen IsNot Nothing Then
Dim penWidth As Single = Pen.Width / 2F
rect.Inflate(penWidth, penWidth)
End If
Return rect
End Function
''' <summary>
''' Draws the object on specified <see cref="System.Drawing.Graphics" /> in the object space.
''' </summary>
''' <param name="viewer">An image viewer.</param>
''' <param name="g">A graphics where the object must be drawn.</param>
''' <remarks>
''' This method draws object after the PointTransform is applied to
''' the Graphics, specified by <i>g</i> parameter.<br /><br />
''' By default this method does not do anything.
''' </remarks>
Public Overrides Sub DrawInObjectSpace(viewer As Vintasoft.Imaging.UI.ImageViewer, g As System.Drawing.Graphics)
If viewer.Image Is Nothing Then
Return
End If
Dim rect As System.Drawing.RectangleF = GetRectangle(_location, viewer.Image)
If Brush IsNot Nothing Then
g.FillRectangle(Brush, rect)
End If
If Pen IsNot Nothing AndAlso Not CellSize.IsEmpty Then
Dim cellHeight As Single = CSng(Vintasoft.Imaging.Utils.UnitOfMeasureConverter.ConvertToPixels(CellSize.Height, CellUnitOfMeasure))
Dim countRow As Integer = CInt(Math.Truncate(System.Math.Ceiling(rect.Height / cellHeight)))
Dim cellWidth As Single = CSng(Vintasoft.Imaging.Utils.UnitOfMeasureConverter.ConvertToPixels(CellSize.Width, CellUnitOfMeasure))
Dim countColumn As Integer = CInt(Math.Truncate(System.Math.Ceiling(rect.Width / cellWidth)))
If countRow > 0 AndAlso countColumn > 0 Then
Dim x1 As Single = rect.X
Dim y1 As Single = rect.Y + cellHeight
Dim x2 As Single = rect.Right
Dim i As Integer
i = 1
While i < countRow
g.DrawLine(Pen, x1, y1, x2, y1)
i += 1
y1 += cellHeight
End While
x1 += cellWidth
y1 = rect.Y
Dim y2 As Single = rect.Bottom
i = 1
While i < countColumn
g.DrawLine(Pen, x1, y1, x1, y2)
i += 1
x1 += cellWidth
End While
End If
End If
End Sub
''' <summary>
''' Creates a new WpfGridGraphicObject that is a copy of the current instance.
''' </summary>
''' <returns>
''' A new WpfGridGraphicObject that is a copy of this instance.
''' </returns>
Public Overrides Function Clone() As Object
Dim obj As New GridGraphicObject(_tool)
CopyTo(obj)
Return obj
End Function
''' <summary>
''' Copies current WpfGridGraphicObject to the target WpfGridGraphicObject.
''' </summary>
''' <param name="obj">WpfGridGraphicObject to copy.</param>
Public Overrides Sub CopyTo(obj As Vintasoft.Imaging.UI.VisualTools.GraphicObjects.GraphicObject)
MyBase.CopyTo(obj)
Dim gridObj As GridGraphicObject = TryCast(obj, GridGraphicObject)
If gridObj IsNot Nothing Then
gridObj.Location = Location
gridObj.CellSize = CellSize
gridObj.CellUnitOfMeasure = CellUnitOfMeasure
End If
End Sub
''' <summary>
''' Gets the rectangle of grid.
''' </summary>
''' <param name="location">The location.</param>
''' <param name="image">The image.</param>
Private Function GetRectangle(location As System.Drawing.PointF, image As Vintasoft.Imaging.VintasoftImage) As System.Drawing.RectangleF
Dim rect As New System.Drawing.RectangleF(_location.X, _location.Y, image.Width - _location.X, image.Height - _location.Y)
Return rect
End Function
#End Region
End Class
/// <summary>
/// Displays grid over image in image viewer.
/// </summary>
/// <param name="viewer">The viewer.</param>
public static void DrawGridOverImageInImageViewer(Vintasoft.Imaging.UI.ImageViewer viewer)
{
// create visual tool that can display static graphic objects in an image viewer
Vintasoft.Imaging.UI.VisualTools.GraphicObjects.GraphicObjectTool tool =
new Vintasoft.Imaging.UI.VisualTools.GraphicObjects.GraphicObjectTool();
// create graphic object that displays image grid
GridGraphicObject grid = new GridGraphicObject(tool);
// add graphic object to the visual tool
tool.GraphicObjectCollection.Add(grid);
// set visual tool as current visual tool of image viewer
viewer.VisualTool = tool;
}
/// <summary>
/// Represents an image grid which can be displayed in image viewer.
/// </summary>
public class GridGraphicObject :
Vintasoft.Imaging.UI.VisualTools.GraphicObjects.GraphicObject
{
#region Fields
Vintasoft.Imaging.UI.VisualTools.VisualTool _tool;
#endregion
#region Constructors
/// <summary>
/// Initializes a new instance of the <see cref="GridGraphicObject"/> class.
/// </summary>
/// <param name="tool">The visual tool.</param>
public GridGraphicObject(Vintasoft.Imaging.UI.VisualTools.VisualTool tool)
{
if (tool == null)
throw new System.ArgumentNullException();
_tool = tool;
Pen = new System.Drawing.Pen(
System.Drawing.Color.FromArgb(128, System.Drawing.Color.Lime), 1);
PointTransform =
new Vintasoft.Imaging.UI.VisualTools.PixelsToImageViewerPointFTransform();
}
#endregion
#region Properties
System.Drawing.PointF _location = System.Drawing.PointF.Empty;
/// <summary>
/// Gets or sets the location of grid.
/// </summary>
/// <value>
/// Default value is <b>(0,0)</b>.
/// </value>
public System.Drawing.PointF Location
{
get
{
return _location;
}
set
{
_location = value;
}
}
System.Drawing.SizeF _cellSize = new System.Drawing.SizeF(1, 1);
/// <summary>
/// Gets or sets the size of the grid cell.
/// </summary>
/// <value>
/// Default value is <b>(1,1)</b>.
/// </value>
public System.Drawing.SizeF CellSize
{
get
{
return _cellSize;
}
set
{
_cellSize = value;
}
}
Vintasoft.Imaging.UnitOfMeasure _cellUnitOfMeasure =
Vintasoft.Imaging.UnitOfMeasure.Centimeters;
/// <summary>
/// Gets or sets the unit of measure of the grid cell.
/// </summary>
/// <value>
/// Default value is <b>UnitOfMeasure.Centimeters</b>.
/// </value>
public Vintasoft.Imaging.UnitOfMeasure CellUnitOfMeasure
{
get
{
return _cellUnitOfMeasure;
}
set
{
_cellUnitOfMeasure = value;
}
}
#endregion
#region Methods
/// <summary>
/// Determines that point belongs the object.
/// </summary>
/// <param name="x">X coordinate of point in object space.</param>
/// <param name="y">Y coordinate of point in object space.</param>
/// <returns>
/// <b>true</b> if point belongs the object;
/// otherwise, <b>false</b>.
/// </returns>
public override bool IsPointOnObject(float x, float y)
{
if (_tool.ImageViewer.Image != null &&
(Pen != null || Brush != null))
{
System.Drawing.RectangleF rect = GetRectangle(_location, _tool.ImageViewer.Image);
return rect.Contains(x, y);
}
else
return false;
}
/// <summary>
/// Returns a bounding box of object, in object space.
/// </summary>
/// <returns>
/// Bounding box of object, in object space.
/// </returns>
public override System.Drawing.RectangleF GetBoundingBox()
{
if (_tool.ImageViewer.Image != null)
return GetRectangle(_location, _tool.ImageViewer.Image);
else
return System.Drawing.RectangleF.Empty;
}
/// <summary>
/// Returns a drawing rectangle of object, in object space.
/// </summary>
/// <param name="viewer">An image viewer.</param>
/// <returns>
/// Drawing rectangle of object, in object space.
/// </returns>
public override System.Drawing.RectangleF GetDrawingBox(Vintasoft.Imaging.UI.ImageViewer viewer)
{
if (viewer.Image == null)
return System.Drawing.RectangleF.Empty;
System.Drawing.RectangleF rect = GetRectangle(_location, viewer.Image);
if (Pen != null)
{
float penWidth = Pen.Width / 2.0f;
rect.Inflate(penWidth, penWidth);
}
return rect;
}
/// <summary>
/// Draws the object on specified <see cref="System.Drawing.Graphics" /> in the object space.
/// </summary>
/// <param name="viewer">An image viewer.</param>
/// <param name="g">A graphics where the object must be drawn.</param>
/// <remarks>
/// This method draws object after the PointTransform is applied to
/// the Graphics, specified by <i>g</i> parameter.<br /><br />
/// By default this method does not do anything.
/// </remarks>
public override void DrawInObjectSpace(Vintasoft.Imaging.UI.ImageViewer viewer, System.Drawing.Graphics g)
{
if (viewer.Image == null)
return;
System.Drawing.RectangleF rect = GetRectangle(_location, viewer.Image);
if (Brush != null)
g.FillRectangle(Brush, rect);
if (Pen != null && !CellSize.IsEmpty)
{
float cellHeight =
(float)Vintasoft.Imaging.Utils.UnitOfMeasureConverter.ConvertToPixels(CellSize.Height, CellUnitOfMeasure);
int countRow = (int)System.Math.Ceiling(rect.Height / cellHeight);
float cellWidth =
(float)Vintasoft.Imaging.Utils.UnitOfMeasureConverter.ConvertToPixels(CellSize.Width, CellUnitOfMeasure);
int countColumn = (int)System.Math.Ceiling(rect.Width / cellWidth);
if (countRow > 0 && countColumn > 0)
{
float x1 = rect.X;
float y1 = rect.Y + cellHeight;
float x2 = rect.Right;
int i;
for (i = 1; i < countRow; i++, y1 += cellHeight)
g.DrawLine(Pen, x1, y1, x2, y1);
x1 += cellWidth;
y1 = rect.Y;
float y2 = rect.Bottom;
for (i = 1; i < countColumn; i++, x1 += cellWidth)
g.DrawLine(Pen, x1, y1, x1, y2);
}
}
}
/// <summary>
/// Creates a new WpfGridGraphicObject that is a copy of the current instance.
/// </summary>
/// <returns>
/// A new WpfGridGraphicObject that is a copy of this instance.
/// </returns>
public override object Clone()
{
GridGraphicObject obj = new GridGraphicObject(_tool);
CopyTo(obj);
return obj;
}
/// <summary>
/// Copies current WpfGridGraphicObject to the target WpfGridGraphicObject.
/// </summary>
/// <param name="obj">WpfGridGraphicObject to copy.</param>
public override void CopyTo(Vintasoft.Imaging.UI.VisualTools.GraphicObjects.GraphicObject obj)
{
base.CopyTo(obj);
GridGraphicObject gridObj = obj as GridGraphicObject;
if (gridObj != null)
{
gridObj.Location = Location;
gridObj.CellSize = CellSize;
gridObj.CellUnitOfMeasure = CellUnitOfMeasure;
}
}
/// <summary>
/// Gets the rectangle of grid.
/// </summary>
/// <param name="location">The location.</param>
/// <param name="image">The image.</param>
private System.Drawing.RectangleF GetRectangle(
System.Drawing.PointF location,
Vintasoft.Imaging.VintasoftImage image)
{
System.Drawing.RectangleF rect = new System.Drawing.RectangleF(
_location.X, _location.Y,
image.Width - _location.X, image.Height - _location.Y);
return rect;
}
#endregion
}
Иерархия наследования
Требования
Целевые платформы: .NET 8; .NET 7; .NET 6; .NET Framework 4.8, 4.7, 4.6, 4.5, 4.0, 3.5
Смотрите также