VintaSoft Imaging .NET SDK 15.1: Документация для .NET разработчика
В этом разделе
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