LeadTools 通过加载DICOMDIR来创建一个3D对象

发布时间:2015/11/17 00:11 发布者:iceman

返回博客中心

在本教程中,您将学习到应该如何创建一个3D对象。

请您打开Visual Studio2005或一个更高的版本。

  1. 从菜单中依次选择“文件”、“新建”、“项目”。
  2. 在“新建项目”对话框中,选择“Visual C#” ,再选择 “Windows窗体应用程序”。
  3. 在“项目名称”字段里输入该项目的名称“通过加载DICOMDIR来创建一个3D对象”,然后选择“确定”。如果需要的话,请为您的项目输入一个新的位置或者选择一个使用“浏览”按钮的目录,然后选择“确定”。
  4. 从“视图”菜单中选择“解决方案资源管理器”。
  5. 在“解决方案资源管理器”的树型图中,右键单击“引用”节点,然后选择“添加引用”。
  6. 在“添加引用”对话框中选择“浏览”选项卡,然后添加以下这些DLL文件:
    • Leadtools.dll
    • Leadtools.Codecs.dll
    • Leadtools.MedicalViewer.dll
    • Leadtools.Medical3D.dll
    • Leadtools.Dicom.dll
    • Leadtools.Codecs.Cmp.dll

切换到Form1代码视图(在“解决方案资源管理器”上右键单击Form1,然后选择“查看代码”),并在文件的开头添加以下几行代码:

[Visual Basic]
            Imports Leadtools
            Imports Leadtools.Codecs
            Imports Leadtools.MedicalViewer
            Imports Leadtools.Medical3D
            Imports Leadtools.Dicom
            
[C#]
            using Leadtools;
            using Leadtools.Codecs;
            using Leadtools.MedicalViewer;
            using Leadtools.Medical3D;
            using Leadtools.Dicom;

 

在Form1中,创建一个新的方法InitClass()。

[Visual Basic]
            Private Sub InitClass()
               Dim MY_LICENSE_FILE As String = "d:\temp\TestLic.lic"
                 
               ' 开启 DICOM 支持。
               Dim MY_DicomDEVELOPER_KEY As String = "xyz123abc"
               RasterSupport.SetLicense(MY_LICENSE_FILE, MY_DicomDEVELOPER_KEY);
                 
               ' 开启Medical支持。
               Dim MY_MedicalDEVELOPER_KEY As String = "abc123xyz"
               RasterSupport.SetLicense(MY_LICENSE_FILE, MY_MedicalDEVELOPER_KEY);
                 
               ' 开启 Medical 3D 支持。
               Dim MY_3DDEVELOPER_KEY As String = "123xyzabc"
               RasterSupport.SetLicense(MY_LICENSE_FILE, MY_3DDEVELOPER_KEY);
                 
               ' 创建一个用来加载图像的编解码器类的新实例。
               Dim _codecs As RasterCodecs = New RasterCodecs()
               ' 创建一个医疗查看器的新实例。该查看器布局将被划分为2X2。
               Dim viewer As MedicalViewer = New MedicalViewer(2, 2)
               ' 使视图与整个窗体相匹配。
               viewer.Dock = DockStyle.Fill
               ' 创建一个包含3D对象的3D控件。
               Dim control3D As Medical3DControl = New Medical3DControl()
               ' 添加并设置3D动作。
               control3D.AddAction(MedicalViewerActionType.WindowLevel)
               control3D.SetAction(MedicalViewerActionType.WindowLevel, MedicalViewerMouseButtons.Left, MedicalViewerActionFlags.Active)
               ' 加载任意的多帧图像(帧的数目超过3),并将其添加到该单元格的“图像”属性。
               Dim object3D As Medical3DObject = New Medical3DObject()
               ' 将新创建的3D对象添加到控件。
               control3D.ObjectsContainer.Objects.Add(object3D)
               ' 将以上单元格添加到MedicalViewer。
               viewer.Cells.Add(control3D)
               ' 将该查看器添加到窗体控件。
               Controls.Add(viewer)
            End Sub
            
[C#]
            void InitClass()
            {
               string MY_LICENSE_FILE = "d:\\temp\\TestLic.lic";
               
               // 开启 DICOM 支持。
               string MY_DicomDEVELOPER_KEY = "xyz123abc";
               RasterSupport.SetLicense(MY_LICENSE_FILE, MY_DicomDEVELOPER_KEY);
                 
               // 开启 Medical 支持。
               string MY_MedicalDEVELOPER_KEY = "abc123xyz";
               RasterSupport.SetLicense(MY_LICENSE_FILE, MY_MedicalDEVELOPER_KEY);
                 
               // 开启 Medical 3D 支持。
               string MY_3DDEVELOPER_KEY = "123xyzabc";
               RasterSupport.SetLicense(MY_LICENSE_FILE, MY_3DDEVELOPER_KEY);
               
               // 创建一个用来加载图像的编解码器类的新实例。
               RasterCodecs _codecs = new RasterCodecs();
               // 创建一个医疗查看器的新实例。该查看器布局将被划分为2X2。
               MedicalViewer viewer = new MedicalViewer(2, 2);
               // 使视图与整个窗体相匹配。
               viewer.Dock = DockStyle.Fill;
               // 创建一个包含3D对象的3D控件。
               Medical3DControl control3D = new Medical3DControl();
               // 添加并设置3D动作。
               control3D.AddAction(MedicalViewerActionType.WindowLevel);
               control3D.SetAction(MedicalViewerActionType.WindowLevel, MedicalViewerMouseButtons.Left, MedicalViewerActionFlags.Active);
               //加载任意的多帧图像(帧的数目超过3),并将其添加到该单元格的“图像”属性。
               Medical3DObject object3D = new Medical3DObject();
               // 将新创建的3D对象添加到控件。
               control3D.ObjectsContainer.Objects.Add(object3D);
               // 将以上单元格添加到MedicalViewer.
               viewer.Cells.Add(control3D);
               // 将该查看器添加到窗体控件。
               Controls.Add(viewer);
            }

 

  1. 请从Form1的构造函数中调用InitClass方法,并将该调用放置并添加于InitializeComponent().之后。
  2. 现在,请运行该程序,您将会看到一个2X2的布局,其中的每一个间隔都是以一个空的3D��象为填充的。
  3. 现在,您可能需要具备一个DICOMDIR文件以进行下一个步骤。您可以从我们的网站上来下载一个示例。请点击这里下载文件,并将文件解压缩到“C:\Leadtools_DICOMDIR”。

请将如下代码添加到您的项目中initclass()方法的下方。此代码将从所下载的DICOMDIR文件中加载一个特定的科目和系列。注意:在LEADTOOLS 18\Examples\DotNet\<VB or CS>\Common文件夹中,可以找到这样一个示例对话框“SeriesBrowser”。该对话框可以用来做以下这些工作。如果您想要了解更多的相关信息,请参阅“Main3DDemo源代码”。

[Visual Basic]
            Private _studyElement As DicomElement
            Private _seriesElement As DicomElement
            Private _seriesManager As MedicalViewerSeriesManager
            Private _imageDataList As List(Of MedicalViewerImageData)
            Private doubleArray As Double()
            Private patientElement As DicomElement
            Private referenceUID As String
            Private imageElement As DicomElement
            Private output As MedicalViewerSeriesManager
            ' 请先找到使用了“科目示例 UID”的科目,在找到它之后请返回它的DicomElement。
            Private Function FindStudy(ByVal ds As DicomDataSet, ByVal studyInstanceUID As String) As DicomElement
               ' 获取父元素。
               Dim patientElement As DicomElement = ds.GetFirstKey(Nothing, True)
               Dim studyElement As DicomElement = Nothing
               Dim studyInformationElement As DicomElement = Nothing
               Dim studyID As String
               studyElement = ds.GetChildKey(patientElement)
               studyElement = ds.GetChildElement(studyElement, True)
               Do While Not studyElement Is Nothing
                  studyInformationElement = ds.FindFirstElement(studyElement, DicomTag.StudyInstanceUID, True)
                  If Not studyInformationElement Is Nothing Then
                    studyID = ds.GetConvertValue(studyInformationElement)
                    If studyID = studyInstanceUID Then
                       Return studyInformationElement
                    End If
                  End If
                  studyElement = ds.GetNextKey(studyElement, True)
                  studyElement = ds.GetChildElement(studyElement, True)
               Loop
               Return Nothing
            End Function
            ' 请先找到使用了“系列示例UID”的“系列”,在找到它之后请返回它的DicomElement。
            Private Function FindSeries(ByVal ds As DicomDataSet, ByVal studyElement As DicomElement, ByVal seriesInstanceUID As String) As DicomElement
               Dim seriesElement As DicomElement = Nothing
               Dim seriesInformationElement As DicomElement = Nothing
               Dim seriesID As String
               seriesElement = ds.GetChildKey(studyElement)
               seriesElement = ds.GetChildElement(seriesElement, True)
               Do While Not seriesElement Is Nothing
                  seriesInformationElement = ds.FindFirstElement(seriesElement, DicomTag.SeriesInstanceUID, True)
                  If Not seriesInformationElement Is Nothing Then
                    seriesID = ds.GetConvertValue(seriesInformationElement)
                    If seriesID = seriesInstanceUID Then
                       Return seriesInformationElement
                    End If
                  End If
                  seriesElement = ds.GetNextKey(seriesElement, True)
                  seriesElement = ds.GetChildElement(seriesElement, True)
               Loop
               Return Nothing
            End Function
              ' 返回该系列的第一个帧的文件名。
              Private Function GetFirstImageName(ByVal ds As DicomDataSet, ByVal seriesElement As DicomElement, ByVal directoryPath As String, <System.Runtime.InteropServices.Out()> ByRef imageElement As DicomElement) As String
               Dim imageIDElement As DicomElement = Nothing
               imageElement = ds.GetChildKey(seriesElement)
               imageElement = ds.GetChildElement(imageElement, True)
               Do While Not imageElement Is Nothing
                  imageIDElement = ds.FindFirstElement(imageElement, DicomTag.ReferencedFileID, True)
                  If Not imageIDElement Is Nothing Then
                    Return directoryPath & "\" & ds.GetConvertValue(imageIDElement)
                  End If
               Loop
               Return ""
              End Function
              ' 返回该系列的下一帧的文件名。
              Private Function GetNextImageName(ByVal ds As DicomDataSet, ByVal directoryPath As String, ByRef imageElement As DicomElement) As String
                Dim nextImageElement As DicomElement = Nothing
                imageElement = ds.GetNextKey(imageElement, True)
                imageElement = ds.GetChildElement(imageElement, True)
                Do While Not imageElement Is Nothing
                  nextImageElement = ds.FindFirstElement(imageElement, DicomTag.ReferencedFileID, True)
                  If Not imageElement Is Nothing Then
                    Dim echoElement As DicomElement = ds.FindFirstElement(imageElement, DicomTag.EchoNumber, True)
                    Return directoryPath & "\" & ds.GetConvertValue(nextImageElement)
                  End If
                Loop
                Return ""
              End Function
              ' 这将会加载DICOM数据集的信息,并将其保存到MedicalViewerImageData类的一个新实例中。
              Private Function AddImageToImageArray(ByVal ds As DicomDataSet, ByVal index As Integer, ByVal imagePath As String, <System.Runtime.InteropServices.Out()> ByRef echoNumber As Integer) As Boolean
                echoNumber = -1
                Dim imageData As MedicalViewerImageData = New MedicalViewerImageData()
                patientElement = ds.FindFirstElement(Nothing, DicomTag.ImagePositionPatient, True)
                doubleArray = ds.GetDoubleValue(patientElement, 0, 3)
                imageData.ImagePosition = Point3D.FromDoubleArray(doubleArray)
                imageData.Data = imagePath
                imageData.EchoNumber = echoNumber
                patientElement = ds.FindFirstElement(Nothing, DicomTag.FrameOfReferenceUID, True)
                referenceUID = ds.GetConvertValue(patientElement)
                imageData.FrameOfReferenceUID = referenceUID
                patientElement = ds.FindFirstElement(Nothing, DicomTag.ImageOrientationPatient, True)
                imageData.ImageOrientation = ds.GetConvertValue(patientElement)
                patientElement = ds.FindFirstElement(Nothing, DicomTag.PixelSpacing, True)
                doubleArray = ds.GetDoubleValue(patientElement, 0, 2)
                imageData.PixelSpacing = New Point2D(CSng(doubleArray(0)), CSng(doubleArray(1)))
                patientElement = ds.FindFirstElement(Nothing, DicomTag.InstanceNumber, True)
                If Not patientElement Is Nothing Then
                  imageData.InstanceNumber = Convert.ToInt32(ds.GetConvertValue(patientElement))
                End If
                patientElement = ds.FindFirstElement(Nothing, DicomTag.InstanceCreationTime, True)
                If Not patientElement Is Nothing Then
                  imageData.CaptureTime = Convert.ToDateTime(ds.GetConvertValue(patientElement))
                End If
                _imageDataList.Add(imageData)
                Return True
              End Function
              Public Function Load_Chest_CT_Compressed() As MedicalViewerSeriesManager
               Dim fileName As String = "C:\Leadtools_DICOMDIR\"
               Dim studyInstanceUID As String = "1.3.12.2.1107.5.99.2.5562.4.0.575080331232768"
               Dim seriesInstanceUID As String = "1.3.12.2.1107.5.99.2.5562.4.0.575080411334689"
               Return LoadSeries(fileName, studyInstanceUID, seriesInstanceUID, 158)
              End Function
             ' 这将会从由文件名指定的文件中加载由seriesInstanceUID和studyInstanceUID指定的那些系列。
              Private Function LoadSeries(ByVal fileName As String, ByVal studyInstanceUID As String, ByVal seriesInstanceUID As String, ByVal count As Integer) As MedicalViewerSeriesManager
               DicomEngine.Startup()
               Dim ds As DicomDataSet = New DicomDataSet()
               ds.Load(fileName & "DICOMDIR", DicomDataSetLoadFlags.None)
               Dim directoryPath As String = fileName
               ' 在这里,程序会搜索包含指定的studyInstanceUID的科目。
               _studyElement = FindStudy(ds, studyInstanceUID)
               ' 在这里,程序会搜索包含指定的seriesInstanceUID的系列。
               _seriesElement = FindSeries(ds, _studyElement, seriesInstanceUID)
               ' 创建一个将用于对图像进行排序的MedicalViewerSeriesManager的新实例,以便创建一个正确的3D对象。
               _seriesManager = New MedicalViewerSeriesManager()
               ' 创建一个MedicalViewerImageData数组。这个类将会被用于保存帧信息。而该信息则将被用于对图像进行排序。
               _imageDataList = New List(Of MedicalViewerImageData)()
               Dim dicomDataSet As DicomDataSet
               Dim imageIndex As Integer
               Dim imagePath As String
               Dim echoNumber As Integer = 0
               ' 现在,该项目将会注意审查该系列中的每一帧。
               imagePath = GetFirstImageName(ds, _seriesElement, directoryPath, imageElement)
               imageIndex = 0
               Do While imageIndex < count
                 Try
                    ' 该系列中的每个图像将会被加载。
                    dicomDataSet = New DicomDataSet()
                    dicomDataSet.Load(imagePath, DicomDataSetLoadFlags.None)
                    ' 该程序将会加载它的信息,并将其保存到MedicalViewerImageData类的一个新实例中。
                    AddImageToImageArray(dicomDataSet, imageIndex, imagePath, echoNumber)
                    dicomDataSet.Dispose()
                    ' 跳到下一个图像。
                    imagePath = GetNextImageName(ds, directoryPath, imageElement)
                   Catch exception As System.Exception
                    System.Diagnostics.Debug.Assert(False, exception.Message)
                    Throw
                   End Try
                  imageIndex += 1
               Loop
                ' 根据它的数据对图像进行排序。
                _seriesManager.Sort(_imageDataList)
                DicomEngine.Shutdown()
                Return _seriesManager
              End Function
            
[C#]
              DicomElement _studyElement;
              DicomElement _seriesElement;
              MedicalViewerSeriesManager _seriesManager;
              List<MedicalViewerImageData> _imageDataList;
              double[] doubleArray;
              DicomElement patientElement;
              string referenceUID;
              DicomElement imageElement;
              MedicalViewerSeriesManager output;
              // 请先找到使用了“科目示例 UID”的科目,在找到它之后请返回它的DicomElement。
              private DicomElement FindStudy(DicomDataSet ds, string studyInstanceUID)
              {
                // 获取父元素。
                DicomElement patientElement = ds.GetFirstKey(null, true);
                DicomElement studyElement = null;
                DicomElement studyInformationElement = null;
                string studyID;
                studyElement = ds.GetChildKey(patientElement);
                studyElement = ds.GetChildElement(studyElement, true);
                while (studyElement != null)
                {
                    studyInformationElement = ds.FindFirstElement(studyElement,
                                                 DicomTag.StudyInstanceUID,
                                                 true);
                    if (studyInformationElement != null)
                    {
                       studyID = ds.GetConvertValue(studyInformationElement);
                       if (studyID == studyInstanceUID)
                          return studyInformationElement;
                    }
                    studyElement = ds.GetNextKey(studyElement, true);
                    studyElement = ds.GetChildElement(studyElement, true);
                }
                return null;
              }
              // 请先找到使用了“系列示例UID”的“系列”,在找到它之后请返回它的DicomElement。
              private DicomElement FindSeries(DicomDataSet ds, DicomElement studyElement, string seriesInstanceUID)
              {
                DicomElement seriesElement = null;
                DicomElement seriesInformationElement = null;
                string seriesID;
                seriesElement = ds.GetChildKey(studyElement);
                seriesElement = ds.GetChildElement(seriesElement, true);
                while (seriesElement != null)
                {
                    seriesInformationElement = ds.FindFirstElement(seriesElement,
                                                   DicomTag.SeriesInstanceUID,
                                                   true);
                    if (seriesInformationElement != null)
                    {
                       seriesID = ds.GetConvertValue(seriesInformationElement);
                       if (seriesID == seriesInstanceUID)
                          return seriesInformationElement;
                    }
                    seriesElement = ds.GetNextKey(seriesElement, true);
                    seriesElement = ds.GetChildElement(seriesElement, true);
                }
                return null;
              }
              // 返回该系列的第一个帧的文件名。
              private string GetFirstImageName(DicomDataSet ds, DicomElement seriesElement, string directoryPath, out DicomElement imageElement)
              {
                DicomElement imageIDElement = null;
                imageElement = ds.GetChildKey(seriesElement);
                imageElement = ds.GetChildElement(imageElement, true);
                while (imageElement != null)
                {
                    imageIDElement = ds.FindFirstElement(imageElement,
                                         DicomTag.ReferencedFileID,
                                         true);
                    if (imageIDElement != null)
                    {
                       return directoryPath + "\\" + ds.GetConvertValue(imageIDElement);
                    }
                }
                return "";
              }
              // 返回该系列的下一帧的文件名。
              private string GetNextImageName(DicomDataSet ds, string directoryPath, ref DicomElement imageElement)
              {
                 DicomElement nextImageElement = null;
                 imageElement = ds.GetNextKey(imageElement, true);
                 imageElement = ds.GetChildElement(imageElement, true);
                 while (imageElement != null)
                 {
                    nextImageElement = ds.FindFirstElement(imageElement,
                                       DicomTag.ReferencedFileID,
                                       true);
                    if (imageElement != null)
                    {
                       DicomElement echoElement = ds.FindFirstElement(imageElement,
                                         DicomTag.EchoNumber,
                                         true);
                       return directoryPath + "\\" + ds.GetConvertValue(nextImageElement);
                    }
                }
                 return "";
              }
              // 这将会加载DICOM数据集的信息,并将其保存到MedicalViewerImageData类的一个新实例中。
              private bool AddImageToImageArray(DicomDataSet ds, int index, string imagePath, out int echoNumber)
              {
                 echoNumber = -1;
                 MedicalViewerImageData imageData = new MedicalViewerImageData();
                 patientElement = ds.FindFirstElement(null,
                                      DicomTag.ImagePositionPatient,
                                      true);
                 doubleArray = ds.GetDoubleValue(patientElement, 0, 3);
                 imageData.ImagePosition = Point3D.FromDoubleArray(doubleArray);
                 imageData.Data = imagePath;
                 imageData.EchoNumber = echoNumber;
                 patientElement = ds.FindFirstElement(null,
                                     DicomTag.FrameOfReferenceUID,
                                     true);
                 referenceUID = ds.GetConvertValue(patientElement);
                 imageData.FrameOfReferenceUID = referenceUID;
                 patientElement = ds.FindFirstElement(null,
                                     DicomTag.ImageOrientationPatient,
                                     true);
                 imageData.ImageOrientation = ds.GetConvertValue(patientElement);
                 patientElement = ds.FindFirstElement(null,
                                      DicomTag.PixelSpacing,
                                      true);
                 doubleArray = ds.GetDoubleValue(patientElement, 0, 2);
                 imageData.PixelSpacing = new Point2D((float)doubleArray[0], (float)doubleArray[1]);
                 patientElement = ds.FindFirstElement(null,
                                     DicomTag.InstanceNumber,
                                     true);
                 if (patientElement != null)
                    imageData.InstanceNumber = Convert.ToInt32(ds.GetConvertValue(patientElement));
                 patientElement = ds.FindFirstElement(null,
                                     DicomTag.InstanceCreationTime,
                                     true);
                 if (patientElement != null)
                    imageData.CaptureTime = Convert.ToDateTime(ds.GetConvertValue(patientElement));
                 _imageDataList.Add(imageData);
                 return true;
              }
              public MedicalViewerSeriesManager Load_Chest_CT_Compressed()
              {
                string fileName = @"C:\Leadtools_DICOMDIR\";
                string studyInstanceUID = "1.3.12.2.1107.5.99.2.5562.4.0.575080331232768";
                string seriesInstanceUID = "1.3.12.2.1107.5.99.2.5562.4.0.575080411334689";
                return LoadSeries(fileName, studyInstanceUID, seriesInstanceUID, 158);
              }
              //  这将会从由文件名指定的文件中加载由seriesInstanceUID和studyInstanceUID指定的那些系列。
              private MedicalViewerSeriesManager LoadSeries(string fileName, string studyInstanceUID, string seriesInstanceUID, int count)
              {
                DicomEngine.Startup();
                DicomDataSet ds = new DicomDataSet();
                ds.Load(fileName + "DICOMDIR", DicomDataSetLoadFlags.None);
                string directoryPath = fileName;
                // 在这里,程序会搜索包含指定的studyInstanceUID的科目。
                _studyElement = FindStudy(ds, studyInstanceUID);
                // 在这里,程序会搜索包含指定的seriesInstanceUID的系列。
                _seriesElement = FindSeries(ds, _studyElement, seriesInstanceUID);
                // 创建一个将用于对图像进行排序的MedicalViewerSeriesManager的新实例,以便创建一个正确的3D对象。
                _seriesManager = new MedicalViewerSeriesManager();
                // 创建一个MedicalViewerImageData数组。这个类将会被用于保存帧信息。而该信息则将被用于对图像进行排序。
                _imageDataList = new List<MedicalViewerImageData>();
                DicomDataSet dicomDataSet;
                int imageIndex;
                string imagePath;
                int echoNumber = 0;
                // 现在,该项目将会注意审查该系列中的每一帧。
                imagePath = GetFirstImageName(ds, _seriesElement, directoryPath, out imageElement);
                for (imageIndex = 0; imageIndex < count; imageIndex++)
                {
                   try
                   {
                      // 该系列中的每个图像将会被加载。
                      dicomDataSet = new DicomDataSet();
                      dicomDataSet.Load(imagePath, DicomDataSetLoadFlags.None);
                      // 该程序将会加载它的信息,并将其保存到MedicalViewerImageData类的一个新实例中。
                      AddImageToImageArray(dicomDataSet, imageIndex, imagePath, out echoNumber);
                      dicomDataSet.Dispose();
                      // 跳到下一个图像。
                      imagePath = GetNextImageName(ds, directoryPath, ref imageElement);
                     }
                     catch (System.Exception exception)
                     {
                       System.Diagnostics.Debug.Assert(false, exception.Message);
                       throw;
                     }
                 }
                 // 根据它的数据对图像进行排序。
                 _seriesManager.Sort(_imageDataList);
                 DicomEngine.Shutdown();
                 return _seriesManager;
             }
            

 

现在,您需要创建一个方法来获取所加载的图像,并从中创建一个使用3D内存效率的方法的3D对象:

[Visual Basic]
            Private Sub Load3DObjectUsingDICOMDIR(ByVal object3D As Medical3DObject)
            ' 启动这些允许加载各种图像的代码。
            Dim _codecs As RasterCodecs = New RasterCodecs()
            ' 加载CT DICOM DIR,并返回图像的排列叠加。
            Dim output As MedicalViewerSeriesManager = Load_Chest_CT_Compressed()
            ' 通过指定将构建成3D对象的部分的数目,来对加载对象进行初始化。            object3D.MemoryEfficientInit(output.Stacks(0).Items.Count)
            ' 循环处理这些图像,并将它们依次添加到所创建的3D对象。
            Dim image As RasterImage
            Dim depth As Integer = output.Stacks(0).Items.Count
            Dim index As Integer
            index = 0
            Do While index < depth
               image = _codecs.Load(CStr(output.Stacks(0).Items(index).Data), 0, CodecsLoadByteOrder.BgrOrGrayOrRomm, 1, 1)
               object3D.MemoryEfficientSetFrame(image, index, output.Stacks(0).Items(index).ImagePosition, True)
               index += 1
            Loop
            ' 通过调用该方法来总结其创建过程。            object3D.MemoryEfficientEnd(output.Stacks(0).Items(0).ImageOrientationArray, output.Stacks(0).PixelSpacing)
            End SubD
            Private Sub Load2DCell(ByVal cell As MedicalViewerMultiCell)
            ' 启动这些允许加载不同的图像的代码。
            Dim _codecs As RasterCodecs = New RasterCodecs()
            '加载CT DICOM DIR,并返回图像的排列叠加。
            Dim output As MedicalViewerSeriesManager = Load_Chest_CT_Compressed()
            ' 循环处理这些图像,并将它们依次添加到最终的图像。
            Dim image As RasterImage = Nothing
            Dim depth As Integer = output.Stacks(0).Items.Count
            Dim index As Integer
            index = 0
            Do While index < depth
               If image Is Nothing Then
                  image = _codecs.Load(CStr(output.Stacks(0).Items(index).Data), 0, CodecsLoadByteOrder.BgrOrGrayOrRomm, 1, 1)
               Else
                  image.AddPage(_codecs.Load(CStr(output.Stacks(0).Items(index).Data), 0, CodecsLoadByteOrder.BgrOrGrayOrRomm, 1, 1))
               End If
               index += 1
            Loop
            cell.Image = image
            End Sub
            
[C#]
            void Load3DObjectUsingDICOMDIR(Medical3DObject object3D)
            {
               // 启动这些允许加载各种图像的代码。
               RasterCodecs _codecs = new RasterCodecs();
               // 加载CT DICOM DIR,并返回图像的排列叠加。
               MedicalViewerSeriesManager output = Load_Chest_CT_Compressed();
               // 通过指定将构建成3D对象的部分的数目,来对加载对象进行初始化。
               object3D.MemoryEfficientInit(output.Stacks[0].Items.Count);
               // 循环处理这些图像,并将它们依次添加到所创建的3D对象。               RasterImage image;
               int depth = output.Stacks[0].Items.Count;
               int index;
               for (index = 0; index < depth; index++)
               {
                  image = _codecs.Load((string)output.Stacks[0].Items[index].Data, 0, CodecsLoadByteOrder.BgrOrGrayOrRomm, 1, 1);
                  object3D.MemoryEfficientSetFrame(image, index, output.Stacks[0].Items[index].ImagePosition, true);
               }
               // 通过调用该方法来总结其创建过程。
               object3D.MemoryEfficientEnd(output.Stacks[0].Items[0].ImageOrientationArray, output.Stacks[0].PixelSpacing);
            }
            void Load2DCell(MedicalViewerMultiCell cell)
            {
               // 启动这些允许加载不同的图像的代码。
               RasterCodecs _codecs = new RasterCodecs();
               // 加载CT DICOM DIR,并返回图像的排列叠加。
               MedicalViewerSeriesManager output = Load_Chest_CT_Compressed();
               // 循环处理这些图像,并将它们依次添加到最终的图像。
               RasterImage image = null;
               int depth = output.Stacks[0].Items.Count;
               int index;
               for (index = 0; index < depth; index++)
               {
                  if (image == null)
                  {
                     image = _codecs.Load((string)output.Stacks[0].Items[index].Data, 0, CodecsLoadByteOrder.BgrOrGrayOrRomm, 1, 1);
                  }
                  else
                     image.AddPage(_codecs.Load((string)output.Stacks[0].Items[index].Data, 0, CodecsLoadByteOrder.BgrOrGrayOrRomm, 1, 1));
               }
               cell.Image = image;
            }
            
14.	最后,在InitClass方法的末尾添加以下这些行代码。这将调用以上可以加载DICOMDIR文件的方法,对它们进行排列,并从中创建3D对象。
[Visual Basic]
            Load3DObjectUsingDICOMDIR(object3D)
            
[C#]
            Load3DObjectUsingDICOMDIR(object3D);

 

  1. 运行该应用程序。如果您已成功地做到这一切,就可以看到MedicalViewer的一个2X2布局。其左上部包含渲染为3D对象的人类胸腔的一部分。

注意:如果您想要了解有关如何获取上述解锁键的更多相关详细信息,请联系LEAD技术支持团队

注意:如果您遇到一个“无效的文件格式”或“功能不支持”的异常,请参阅如下主题无效的文件格式/功能不支持

支持

关于其他产品的更多信息,请访问我们的官方网站

欢迎下载免费的全功能评估版SDK,全功能试用版中有这个例子的全部源代码。

同时欢迎您使用评估版期间的免费技术支持


关于葡萄城

赋能开发者!葡萄城是专业的集开发工具、商业智能解决方案、低代码开发平台于一身的软件和服务提供商,为超过 75% 的全球财富 500 强企业提供服务。葡萄城专注控件软件领域30年,希望通过模块化的开发控件、灵活的低代码应用开发平台等一系列开发工具、解决方案和服务,帮助开发者快速响应复杂多变的业务需求,最大程度地发挥开发者的才智和潜能,让开发者的 IT 人生更从容更美好。

了解详情,请访问葡萄城官网