DICOM: Просмотр DICOM-изображений в WPF
В этом разделе
VintaSoft DICOM .NET Plug-in содержит WPF UI-контрол
WpfDicomSeriesManagerControl, который позволяет отображать информацию о DICOM-сериях, сгруппированных по пациентам и исследованиям, осуществлять навигацию по DICOM-сериям, асинхронно добавлять DICOM-файлы.
Также VintaSoft DICOM .NET Plug-in содержит 2 визуальных инструмента для DICOM-изображений в WPF просмотрщике изображений:
WpfDicomViewerTool,
WpfEcgVisualTool.
WpfDicomSeriesManagerControl UI-контрол
WpfDicomSeriesManagerControl позволяет:
Вот скриншот UI-контрола WpfDicomSeriesManagerControl в демо приложении "VintaSoft WPF DICOM Viewer Demo":
Класс WpfDicomViewerTool
Класс
WpfDicomViewerTool позволяет масштабировать DICOM-кадры и выполнять навигацию по DICOM-кадрам в WPF просмотрщике изображений. Также инструмент позволяет применять VOI LUT к DICOM-кадру в WPF просмотрщике изображений. Также инструмент позволяет отображать метаданные DICOM-кадра в WPF просмотрщике изображений.
Вот C#/VB.NET код, демонстрирующий, как просматривать DICOM-изображение и отображать метаданные DICOM-изображения в WPF просмотрщике изображений:
/// <summary>
/// A visual tool that allows to show name and age of patient.
/// </summary>
public class CustomWpfDicomViewerTool : Vintasoft.Imaging.Dicom.Wpf.UI.VisualTools.WpfDicomViewerTool
{
/// <summary>
/// Initializes a new instance of the <see cref="CustomWpfDicomViewerTool"/> class.
/// </summary>
public CustomWpfDicomViewerTool()
: this(true)
{
}
/// <summary>
/// Initializes a new instance of the <see cref="CustomWpfDicomViewerTool" /> class.
/// </summary>
/// <param name="needUpdateViewerAfterApplyingVoiLut">
/// Determines that the image viewer must be updated after applying VOI lookup table to a DICOM image.
/// </param>
public CustomWpfDicomViewerTool(bool needUpdateViewerAfterApplyingVoiLut)
: base(needUpdateViewerAfterApplyingVoiLut)
{
// clear the default text overlay
TextOverlay.Clear();
// create text overlay of VOI LUT
Vintasoft.Imaging.Dicom.Wpf.UI.VisualTools.WpfDicomImageVoiLutTextOverlay voiLutTextOverlay =
new Vintasoft.Imaging.Dicom.Wpf.UI.VisualTools.WpfDicomImageVoiLutTextOverlay();
// set the anchor of text
voiLutTextOverlay.Anchor = Vintasoft.Imaging.AnchorType.Left | Vintasoft.Imaging.AnchorType.Bottom;
// add text overlay to visual tool
TextOverlay.Add(voiLutTextOverlay);
// the text anchor
Vintasoft.Imaging.AnchorType textAnchor =
Vintasoft.Imaging.AnchorType.Bottom | Vintasoft.Imaging.AnchorType.Right;
// the text color
System.Windows.Media.Brush textBrush = System.Windows.Media.Brushes.Blue;
// create text overlay of patient name
Vintasoft.Imaging.Dicom.Wpf.UI.VisualTools.WpfStandardDicomDataElementTextOverlay patientNameTextOverlay =
new Vintasoft.Imaging.Dicom.Wpf.UI.VisualTools.WpfStandardDicomDataElementTextOverlay(
Vintasoft.Imaging.Codecs.ImageFiles.Dicom.DicomDataElementId.PatientName);
// set the anchor of text
patientNameTextOverlay.Anchor = textAnchor;
// set the color of text
patientNameTextOverlay.TextBrush = textBrush;
// set text format of text
patientNameTextOverlay.TextFormat = "Name: {0}";
// add text overlay to visual tool
TextOverlay.Add(patientNameTextOverlay);
// create text overlay of patient age
Vintasoft.Imaging.Dicom.Wpf.UI.VisualTools.WpfStandardDicomDataElementTextOverlay patientAgeTextOverlay =
new Vintasoft.Imaging.Dicom.Wpf.UI.VisualTools.WpfStandardDicomDataElementTextOverlay(
Vintasoft.Imaging.Codecs.ImageFiles.Dicom.DicomDataElementId.PatientAge);
// set the anchor of text
patientAgeTextOverlay.Anchor = textAnchor;
// set the color of text
patientAgeTextOverlay.TextBrush = textBrush;
// set text format of text
patientAgeTextOverlay.TextFormat = "Age: {0}";
// add text overlay to the visual tool
TextOverlay.Add(patientAgeTextOverlay);
}
}
''' <summary>
''' A visual tool that allows to show name and age of patient.
''' </summary>
Public Class CustomWpfDicomViewerTool
Inherits Vintasoft.Imaging.Dicom.Wpf.UI.VisualTools.WpfDicomViewerTool
''' <summary>
''' Initializes a new instance of the <see cref="CustomWpfDicomViewerTool"/> class.
''' </summary>
Public Sub New()
Me.New(True)
End Sub
''' <summary>
''' Initializes a new instance of the <see cref="CustomWpfDicomViewerTool" /> class.
''' </summary>
''' <param name="needUpdateViewerAfterApplyingVoiLut">
''' Determines that the image viewer must be updated after applying VOI lookup table to a DICOM image.
''' </param>
Public Sub New(needUpdateViewerAfterApplyingVoiLut As Boolean)
MyBase.New(needUpdateViewerAfterApplyingVoiLut)
' clear the default text overlay
TextOverlay.Clear()
' create text overlay of VOI LUT
Dim voiLutTextOverlay As New Vintasoft.Imaging.Dicom.Wpf.UI.VisualTools.WpfDicomImageVoiLutTextOverlay()
' set the anchor of text
voiLutTextOverlay.Anchor = Vintasoft.Imaging.AnchorType.Left Or Vintasoft.Imaging.AnchorType.Bottom
' add text overlay to visual tool
TextOverlay.Add(voiLutTextOverlay)
' the text anchor
Dim textAnchor As Vintasoft.Imaging.AnchorType = Vintasoft.Imaging.AnchorType.Bottom Or Vintasoft.Imaging.AnchorType.Right
' the text color
Dim textBrush As System.Windows.Media.Brush = System.Windows.Media.Brushes.Blue
' create text overlay of patient name
Dim patientNameTextOverlay As New Vintasoft.Imaging.Dicom.Wpf.UI.VisualTools.WpfStandardDicomDataElementTextOverlay(Vintasoft.Imaging.Codecs.ImageFiles.Dicom.DicomDataElementId.PatientName)
' set the anchor of text
patientNameTextOverlay.Anchor = textAnchor
' set the color of text
patientNameTextOverlay.TextBrush = textBrush
' set text format of text
patientNameTextOverlay.TextFormat = "Name: {0}"
' add text overlay to visual tool
TextOverlay.Add(patientNameTextOverlay)
' create text overlay of patient age
Dim patientAgeTextOverlay As New Vintasoft.Imaging.Dicom.Wpf.UI.VisualTools.WpfStandardDicomDataElementTextOverlay(Vintasoft.Imaging.Codecs.ImageFiles.Dicom.DicomDataElementId.PatientAge)
' set the anchor of text
patientAgeTextOverlay.Anchor = textAnchor
' set the color of text
patientAgeTextOverlay.TextBrush = textBrush
' set text format of text
patientAgeTextOverlay.TextFormat = "Age: {0}"
' add text overlay to the visual tool
TextOverlay.Add(patientAgeTextOverlay)
End Sub
End Class
Класс WpfEcgVisualTool
Класс
WpfEcgVisualTool позволяет измерять электрокардиограмму в WPF просмотрщике изображений.
Вот C#/VB.NET код, демонстрирующий, как отобразить информацию о выделении в визуальном инструменте электрокардиограммы:
/// <summary>
/// Helps to display information about selection in <see cref="Vintasoft.Imaging.Dicom.UI.VisualTools.EcgVisualTool"/>.
/// </summary>
public class EcgVisualToolHelper : System.IDisposable
{
#region Fields
/// <summary>
/// The image viewer.
/// </summary>
Vintasoft.Imaging.UI.ImageViewer _viewer;
/// <summary>
/// The label.
/// </summary>
System.Windows.Forms.Label _label;
#endregion
#region Constructors
/// <summary>
/// Initializes a new instance of the <see cref="EcgVisualToolHelper"/> class.
/// </summary>
/// <param name="viewer">The image viewer.</param>
/// <param name="label">The label.</param>
public EcgVisualToolHelper(Vintasoft.Imaging.UI.ImageViewer viewer, System.Windows.Forms.Label label)
{
_viewer = viewer;
_label = label;
// create visual tool
Vintasoft.Imaging.Dicom.UI.VisualTools.EcgVisualTool visualTool = new Vintasoft.Imaging.Dicom.UI.VisualTools.EcgVisualTool();
visualTool.SelectionChanged += EcgVisualTool_SelectionChanged;
// set the visual tool
_viewer.VisualTool = visualTool;
}
#endregion
#region Methods
/// <summary>
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
/// </summary>
public void Dispose()
{
if (_viewer.VisualTool is Vintasoft.Imaging.Dicom.UI.VisualTools.EcgVisualTool)
_viewer.VisualTool = null;
}
/// <summary>
/// Handles the SelectionChanged event of the EcgVisualTool control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="Vintasoft.Imaging.PropertyChangedEventArgs{Vintasoft.Primitives.VintasoftRect}"/> instance containing the event data.</param>
private void EcgVisualTool_SelectionChanged(object sender, Vintasoft.Imaging.PropertyChangedEventArgs<Vintasoft.Primitives.VintasoftRect> e)
{
// if value is specified
if (e.NewValue.Width != 0 || e.NewValue.Height != 0)
{
System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder();
// add time information
stringBuilder.AppendFormat("{0:F0} ms", e.NewValue.Width * 1000);
if (e.NewValue.Height != 0)
// add voltage information
stringBuilder.AppendFormat(", {0:F0} μV", e.NewValue.Height * 1000);
// update text
_label.Text = stringBuilder.ToString();
}
else
{
// remove text
_label.Text = string.Empty;
}
}
#endregion
}
''' <summary>
''' Helps to display information about selection in <see cref="Vintasoft.Imaging.Dicom.UI.VisualTools.EcgVisualTool"/>.
''' </summary>
Public Class EcgVisualToolHelper
Implements System.IDisposable
#Region "Fields"
''' <summary>
''' The image viewer.
''' </summary>
Private _viewer As Vintasoft.Imaging.UI.ImageViewer
''' <summary>
''' The label.
''' </summary>
Private _label As System.Windows.Forms.Label
#End Region
#Region "Constructors"
''' <summary>
''' Initializes a new instance of the <see cref="EcgVisualToolHelper"/> class.
''' </summary>
''' <param name="viewer">The image viewer.</param>
''' <param name="label">The label.</param>
Public Sub New(viewer As Vintasoft.Imaging.UI.ImageViewer, label As System.Windows.Forms.Label)
_viewer = viewer
_label = label
' create visual tool
Dim visualTool As New Vintasoft.Imaging.Dicom.UI.VisualTools.EcgVisualTool()
AddHandler visualTool.SelectionChanged, AddressOf EcgVisualTool_SelectionChanged
' set the visual tool
_viewer.VisualTool = visualTool
End Sub
#End Region
#Region "Methods"
''' <summary>
''' Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
''' </summary>
Public Sub Dispose() Implements System.IDisposable.Dispose
If TypeOf _viewer.VisualTool Is Vintasoft.Imaging.Dicom.UI.VisualTools.EcgVisualTool Then
_viewer.VisualTool = Nothing
End If
End Sub
''' <summary>
''' Handles the SelectionChanged event of the EcgVisualTool control.
''' </summary>
''' <param name="sender">The source of the event.</param>
''' <param name="e">The <see cref="Vintasoft.Imaging.PropertyChangedEventArgs{Vintasoft.Primitives.VintasoftRect}"/> instance containing the event data.</param>
Private Sub EcgVisualTool_SelectionChanged(sender As Object, e As Vintasoft.Imaging.PropertyChangedEventArgs(Of Vintasoft.Primitives.VintasoftRect))
' if value is specified
If e.NewValue.Width <> 0 OrElse e.NewValue.Height <> 0 Then
Dim stringBuilder As New System.Text.StringBuilder()
' add time information
stringBuilder.AppendFormat("{0:F0} ms", e.NewValue.Width * 1000)
If e.NewValue.Height <> 0 Then
' add voltage information
stringBuilder.AppendFormat(", {0:F0} ?V", e.NewValue.Height * 1000)
End If
' update text
_label.Text = stringBuilder.ToString()
Else
' remove text
_label.Text = String.Empty
End If
End Sub
#End Region
End Class