本教程演示如何加载和显示一堆2 d DICOM图像片LEADTOOLS作为3 d对象MedicalViewer
WinForms控制。
概述 | |
---|---|
总结 | 本教程介绍了如何加载和显示一堆2 d DICOM图像片作为一个3 d对象在WinForms c#应用程序。 |
完成时间 | 30分钟 |
Visual Studio项目 | 下载教程项目(12 KB) |
平台 | Windows WinForms c#应用程序 |
IDE | Visual Studio 2019中,2022年 |
开发许可 | 下载LEADTOOLS |
熟悉的基本步骤,创建一个项目并显示DICOM图像通过审查添加引用和设置一个许可证和加载和显示DICOM图像在医学查看器教程,在工作之前加载和显示DICOM图像片作为3 d对象——WinForms c#教程。
的Medical3DControl
使医疗3 d对象和集成MedicalViewer
类是继承了MedicalViewerBaseCell
基本对象,这意味着它与股票类似的功能MedicalViewerMultiCell
类用于显示二维医学图像正常。
渲染3 d体积正确使用正确的测量和扩展,需要以下信息:
此外,对于一个给定的一组二维图像片,横断面飞机必须平行,以正确的顺序。
说明,本教程使用image1.dcm
样本:< INSTALL_DIR > \ LEADTOOLS22 \ \ \ DICOM图像资源
这是一个磁共振(MR)的样品包含了图片正确的顺序以及上面的信息存储在数据集标签。
从项目中创建的副本加载和显示DICOM图像在医学查看器教程。如果项目不可用,按照这个教程中的步骤创建它。
的引用需要取决于项目的目的。引用可以通过添加一个或另一个下面的两种方法(但不是全部)。
如果使用NuGet引用,本教程需要以下NuGet包:
Leadtools.Medical.Viewer.WinForms
Leadtools.Jpeg2000
如果使用本地DLL的引用,下面的DLL是必要的。
dll位于< INSTALL_DIR > \ LEADTOOLS22 \ Bin \ Dotnet4 \ x64
:
Leadtools.dll
Leadtools.Codecs.Cmp.dll
Leadtools.Codecs.J2k.dll
Leadtools.Dicom.dll
Leadtools.MedicalViewer.dll
Leadtools.Medical3D.dll
对于一个完整的列表的应用程序所需的DLL文件,请参考文件包含在您的应用程序。
许可解锁项目需要的特性。它必须设置工具箱函数被调用之前。详情,包括教程为不同的平台,请参考设置一个运行时许可。
有两种类型的运行时许可证:
现在LEADTOOLS引用已经被添加到项目和许可设置,可以开始编码。
右键单击Form1.cs
在解决方案资源管理器并选择视图代码显示形式背后的代码。
添加Leadtools.Medical3D
到使用
块顶部的文件。
使用系统;
使用先;
使用System.Windows.Forms;
使用Leadtools;
使用Leadtools.Dicom;
使用Leadtools.Medical3D;
使用Leadtools.MedicalViewer;
添加Medical3DControl
对象的全局变量。
私人MedicalViewer _medicalViewer;
私人MedicalViewerMultiCell _cell;
私人Medical3DControl _control3D;
修改loadDICOMToolStripMenuItem_Click
事件处理程序添加一个调用Initialize3DControl
函数之后_medicalViewer.Cells.Add (_cell)
。
/ /添加初始化细胞
_medicalViewer.Cells.Add (_cell);
/ /初始化3 d控制
如果(_cell.Image。PageCount > 1)
Initialize3DControl (_cell.Image。宽度,_cell.Image。高度,_cell.Image.PageCount);
确保将下面的代码添加到Initialize3DControl
函数。
私人无效Initialize3DControl (int宽度,int高度,inttotalFrames)
{
/ /创建三维控制
booluseSoftwareRendering = ! Medical3DEngine。CanUse3DTexturing(宽度、高度、totalFrames);
_control3D =新Medical3DControl (useSoftwareRendering);
_control3D.ObjectsContainer。RenderingType = Medical3DVolumeRenderingType.Auto;
_control3D.ObjectsContainer.Objects.Add (新Medical3DObject ());
/ /初始化3 d帧
bool创建= _control3D.ObjectsContainer.Objects [0] .MemoryEfficientInit (totalFrames);
如果创建(!)
{
/ /删除对象
_control3D.ObjectsContainer.Objects.RemoveAt (0);
_control3D.Dispose ();
_control3D =零;
返回;
}
/ /添加3 d控制行动
_control3D.AddAction (MedicalViewerActionType.WindowLevel);
_control3D.AddAction (MedicalViewerActionType.Rotate3DObject);
_control3D.AddAction (MedicalViewerActionType.Scale3DObject);
_control3D.SetAction (MedicalViewerActionType。Rotate3DObject MedicalViewerMouseButtons。对,MedicalViewerActionFlags.Active);
_control3D.SetAction (MedicalViewerActionType。WindowLevel MedicalViewerMouseButtons。离开,MedicalViewerActionFlags.Active);
_control3D.SetAction (MedicalViewerActionType。Scale3DObject MedicalViewerMouseButtons。中间,MedicalViewerActionFlags.Active);
}
初始化3 d控制后,修改代码loadDICOMToolStripMenuItem_Click
事件处理程序来得到每一帧的图像位置信息数据集,用它来正确帧加载到三维控制。
/ /初始化3 d控制
如果(_cell.Image。PageCount > 1)
Initialize3DControl (_cell.Image。宽度,_cell.Image。高度,_cell.Image.PageCount);
如果(_control3D ! =零)
{
/ /填充细胞帧图像从DICOM文件位置信息
SetCellFramesImagePosition(数据集);
/ /添加图像页面3 d控制帧
为(int指数= 0;指数< _cell.Image.PageCount;指数+ +)
{
_cell.Image。页面=指数+ 1;
_control3D.ObjectsContainer.Objects [0] .MemoryEfficientSetFrame (_cell.Image.Clone(),索引,_cell.GetImagePosition(指数),真正的);
}
}
添加一个新方法SetCellFramesImagePosition (DicomDataSet数据集)
。该方法将被称为内loadDICOMToolStripMenuItem_Click
事件处理程序,如上所示。将下面的代码添加到从DICOM数据集加载图像的位置信息,并设置它的属性为每个框架在2 d细胞。
私人无效SetCellFramesImagePosition (DicomDataSet数据集)
{
int指数= 0;
= dataSet.FindFirstElement DicomElement元素(零DicomTag.PerFrameFunctionalGroupsSequence,真正的);
如果(元素! =零)
{
元素= dataSet.GetChildElement(元素,真正的);
DicomElement firstItem =数据集。FindFirstElement(元素、DicomTag.Item真正的);
而(firstItem ! =零)
{
元素= dataSet.GetChildElement (firstItem,真正的);
元素=数据集。FindFirstElement(元素、DicomTag.PlanePositionSequence真正的);
元素= dataSet.GetChildElement(元素,真正的);
元素=数据集。FindFirstElement(元素、DicomTag.Item真正的);
元素= dataSet.GetChildElement(元素,真正的);
元素=数据集。FindFirstElement(元素、DicomTag.ImagePositionPatient真正的);
如果(元素! =零)
{
双[]doubleArray =数据集。GetDoubleValue(元素0 3);
_cell。SetImagePosition(指数,Point3D.FromDoubleArray (doubleArray),假);
指数+ +;
}
firstItem = dataSet.GetNextElement (firstItem,真正的,真正的);
}
}
}
一旦所有的帧被加载到三维控制,将下面的代码添加到loadDICOMToolStripMenuItem_Click
事件处理程序完成设置帧和标签。
如果(_control3D ! =零)
{
/ /填充细胞帧图像从DICOM文件位置信息
SetCellFramesImagePosition(数据集);
/ /添加图像页面3 d控制帧
为(int指数= 0;指数< _cell.Image.PageCount;指数+ +)
{
_cell.Image。页面=指数+ 1;
_control3D.ObjectsContainer.Objects [0] .MemoryEfficientSetFrame (_cell.Image.Clone(),索引,_cell.GetImagePosition(指数),真正的);
}
/ /从DICOM图像定位
SetCellImageOrientation(数据集);
/ /从DICOM得到像素间距
SetCellPixelSpacing(数据集);
/ /完成
_control3D.ObjectsContainer.Objects [0] .MemoryEfficientEnd (_cell。ImageOrientation _cell.PixelSpacing);
/ /设置标签
Set3DTags ();
}
添加两个新方法命名SetCellImageOrientation (DicomDataSet数据集)
和SetCellPixelSpacing (DicomDataSet数据集)
。这两种方法将被称为内loadDICOMToolStripMenuItem_Click
事件处理程序,如上所示。将下面的代码添加到SetCellImageOrientation
函数来得到数据集的图像定位。
私人无效SetCellImageOrientation (DicomDataSet数据集)
{
= dataSet.FindFirstElement DicomElement元素(零DicomTag.PerFrameFunctionalGroupsSequence,真正的);
如果(元素! =零)
{
元素= dataSet.GetChildElement(元素,真正的);
元素=数据集。FindFirstElement(元素、DicomTag.Item真正的);
元素= dataSet.GetChildElement(元素,真正的);
元素=数据集。FindFirstElement(元素、DicomTag.PlaneOrientationSequence真正的);
元素= dataSet.GetChildElement(元素,真正的);
元素=数据集。FindFirstElement(元素、DicomTag.Item真正的);
元素= dataSet.GetChildElement(元素,真正的);
元素=数据集。FindFirstElement(元素、DicomTag.ImageOrientationPatient真正的);
双[]doubleArray =数据集。GetDoubleValue(元素0 6);
_cell。ImageOrientation =新浮动[]{(浮动)doubleArray [0], (浮动)doubleArray [1], (浮动)doubleArray [2], (浮动)doubleArray [3], (浮动)doubleArray [4], (浮动)doubleArray [5]};
}
}
将下面的代码添加到SetCellPixelSpacing
函数的像素间距信息从数据集。
私人无效SetCellPixelSpacing (DicomDataSet数据集)
{
= dataSet.FindFirstElement DicomElement元素(零DicomTag.SharedFunctionalGroupsSequence,真正的);
如果(元素! =零)
{
元素=数据集。FindFirstElement(元素、DicomTag.Item假);
元素=数据集。FindFirstElement(元素、DicomTag.PixelMeasuresSequence假);
元素=数据集。FindFirstElement(元素、DicomTag.Item假);
元素=数据集。FindFirstElement(元素、DicomTag.PixelSpacing假);
双[]doubleArray =数据集。GetDoubleValue(元素0 2);
_cell。PixelSpacing =新Point2D (doubleArray [0], doubleArray [1]);
}
}
添加一个新的名为Set3DTags()函数程序类。这个函数将被称为底部的loadDICOMToolStripMenuItem_Click
事件处理程序,如前面步骤所示。
将下面的代码添加到设置相关的3 d控制标签使用2 d细胞的标记。
私人无效Set3DTags ()
{
MedicalViewerTagInformation信息;
/ /加载用户数据标签的多细胞
= _cell信息。MedicalViewerTagAlignment.TopRight GetTag (2);
如果(信息! =零)_control3D。MedicalViewerTagAlignment SetTag (1。TopRight,信息。类型,information.Text);
= _cell信息。MedicalViewerTagAlignment.TopRight GetTag (3);
如果(信息! =零)_control3D。MedicalViewerTagAlignment SetTag (2。TopRight,信息。类型,information.Text);
= _cell信息。MedicalViewerTagAlignment.TopRight GetTag(4日);
如果(信息! =零)_control3D。MedicalViewerTagAlignment SetTag (3。TopRight,信息。类型,information.Text);
= _cell信息。MedicalViewerTagAlignment.TopRight GetTag(5日);
如果(信息! =零)_control3D。MedicalViewerTagAlignment SetTag (4。TopRight,信息。类型,information.Text);
= _cell信息。MedicalViewerTagAlignment.TopRight GetTag(6日);
如果(信息! =零)_control3D。MedicalViewerTagAlignment SetTag (5。TopRight,信息。类型,information.Text);
= _cell信息。MedicalViewerTagAlignment.TopRight GetTag(7日);
如果(信息! =零)_control3D。MedicalViewerTagAlignment SetTag (5。TopRight,信息。类型,information.Text);
/ /其他标签
_control3D。MedicalViewerTagAlignment SetTag (4。TopLeft MedicalViewerTagType.Frame);
_control3D。MedicalViewerTagAlignment SetTag(6日。TopLeft MedicalViewerTagType.Scale);
_control3D。MedicalViewerTagAlignment SetTag (2。BottomLeft MedicalViewerTagType.WindowLevelData);
_control3D。MedicalViewerTagAlignment SetTag (1。BottomLeft MedicalViewerTagType.FieldOfView);
_control3D。MedicalViewerTagAlignment SetTag (0。BottomLeft MedicalViewerTagType.RulerUnit);
}
在解决方案资源管理器,双击Form1.cs
显示它的设计师。添加一个细胞类型菜单menuStrip1
与一个&VRT和一个&2D细胞菜单项。右键单击每个项目和取消启用选择两个。使用_menuVolumeVRT
和_menu2DCell
分别为每个菜单项的名称属性。
为细胞类型菜单对象,单击事件图标属性窗口。然后,双击DropDownOpening创建一个事件处理程序如果不存在。
添加以下代码内部cellTypeToolStripMenuItem_DropDownOpening
事件处理程序。
私人无效cellTypeToolStripMenuItem_DropDownOpening (对象发送方的EventArgs e)
{
boolAllow3D =假;
boolAllow2D =假;
如果(_cell ! =零)
Allow2D =真正的;
如果(_control3D ! =零)
Allow3D =真正的;
_menuVolumeVRT。启用= Allow3D;
_menu2DCell。启用= Allow2D;
}
双击VRT菜单项来编辑它的事件处理程序。添加以下代码来加载3 d控制到观众,如果可用。
私人无效_menuVolumeVRT_Click (对象发送方的EventArgs e)
{
foreach(ToolStripMenuItem ToolStripMenuItem在cellTypeToolStripMenuItem.DropDownItems)
toolStripMenuItem。检查=假;
_menuVolumeVRT。检查=真正的;
如果(_medicalViewer。细胞[0]! = _control3D)
{
_medicalViewer.Cells.Clear ();
_medicalViewer.Cells.Add (_control3D);
}
}
接下来,双击2 d细胞菜单项来编辑它的事件处理程序。添加以下代码2 d细胞加载到观众。
私人无效_menu2DCell_Click (对象发送方的EventArgs e)
{
foreach(ToolStripMenuItem ToolStripMenuItem在cellTypeToolStripMenuItem.DropDownItems)
toolStripMenuItem。检查=假;
_menu2DCell。检查=真正的;
如果(_medicalViewer。细胞[0]! = _cell)
{
_medicalViewer.Cells.Clear ();
_medicalViewer.Cells.Add (_cell);
}
}
最后,添加下面的代码清除选定的细胞类型的可选菜单项当加载一个新的形象。
私人无效loadDICOMToolStripMenuItem_Click (对象发送方的EventArgs e)
{
试一试
{
/ /清楚现有的细胞
如果(_medicalViewer.Cells。数> 0)
_medicalViewer.Cells.Clear ();
/ /清除细胞类型可选菜单
foreach(ToolStripMenuItem ToolStripMenuItem在cellTypeToolStripMenuItem.DropDownItems)
toolStripMenuItem。检查=假;
按运行项目F5,或通过选择调试- >开始调试。
如果是正确的步骤,应用程序运行,并允许加载和显示一组选定的2 d的DICOM图像片MedicalViewer
控制在3 d空间。这可以使用image1.dcm
样本:< INSTALL_DIR > \ LEADTOOLS22 \ \ \ DICOM图像资源
加载示例文件,然后选择细胞类型- > VRT。
本教程展示了如何添加必要的引用来呈现一个3 d的DICOM图像MedicalViewer
WinForms控制。