在本教程中,您将学习到应该如何创建一个3D对象。
请您打开Visual Studio2005或一个更高的版本。
- 从菜单中依次选择“文件”、“新建”、“项目”。
- 在“新建项目”对话框中,选择“Visual C#” ,再选择 “Windows窗体应用程序”。
- 在“项目名称”字段里输入该项目的名称“通过加载DICOMDIR来创建一个3D对象”,然后选择“确定”。如果需要的话,请为您的项目输入一个新的位置或者选择一个使用“浏览”按钮的目录,然后选择“确定”。
- 从“视图”菜单中选择“解决方案资源管理器”。
- 在“解决方案资源管理器”的树型图中,右键单击“引用”节点,然后选择“添加引用”。
- 在“添加引用”对话框中选择“浏览”选项卡,然后添加以下这些DLL文件:
- Leadtools.dll
- Leadtools.Codecs.dll
- Leadtools.MedicalViewer.dll
- Leadtools.Medical3D.dll
- Leadtools.Dicom.dll
- Leadtools.Codecs.Cmp.dll
切换到Form1代码视图(在“解决方案资源管理器”上右键单击Form1,然后选择“查看代码”),并在文件的开头添加以下几行代码:
[Visual Basic]Imports LeadtoolsImports Leadtools.CodecsImports Leadtools.MedicalViewerImports Leadtools.Medical3DImports 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);}
- 请从Form1的构造函数中调用InitClass方法,并将该调用放置并添加于
InitializeComponent().之后。
- 现在,请运行该程序,您将会看到一个2X2的布局,其中的每一个间隔都是以一个空的3D��象为填充的。
- 现在,您可能需要具备一个DICOMDIR文件以进行下一个步骤。您可以从我们的网站上来下载一个示例。请点击这里下载文件,并将文件解压缩到“C:\Leadtools_DICOMDIR”。
请将如下代码添加到您的项目中initclass()
方法的下方。此代码将从所下载的DICOMDIR文件中加载一个特定的科目和系列。注意:在LEADTOOLS 18\Examples\DotNet\<VB or CS>\Common文件夹中,可以找到这样一个示例对话框“SeriesBrowser”。该对话框可以用来做以下这些工作。如果您想要了解更多的相关信息,请参阅“Main3DDemo源代码”。
[Visual Basic]Private _studyElement As DicomElementPrivate _seriesElement As DicomElementPrivate _seriesManager As MedicalViewerSeriesManagerPrivate _imageDataList As List(Of MedicalViewerImageData)Private doubleArray As Double()Private patientElement As DicomElementPrivate referenceUID As StringPrivate imageElement As DicomElementPrivate 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 = NothingDim studyInformationElement As DicomElement = NothingDim studyID As StringstudyElement = ds.GetChildKey(patientElement)studyElement = ds.GetChildElement(studyElement, True)Do While Not studyElement Is NothingstudyInformationElement = ds.FindFirstElement(studyElement, DicomTag.StudyInstanceUID, True)If Not studyInformationElement Is Nothing ThenstudyID = ds.GetConvertValue(studyInformationElement)If studyID = studyInstanceUID ThenReturn studyInformationElementEnd IfEnd IfstudyElement = ds.GetNextKey(studyElement, True)studyElement = ds.GetChildElement(studyElement, True)LoopReturn NothingEnd Function' 请先找到使用了“系列示例UID”的“系列”,在找到它之后请返回它的DicomElement。Private Function FindSeries(ByVal ds As DicomDataSet, ByVal studyElement As DicomElement, ByVal seriesInstanceUID As String) As DicomElementDim seriesElement As DicomElement = NothingDim seriesInformationElement As DicomElement = NothingDim seriesID As StringseriesElement = ds.GetChildKey(studyElement)seriesElement = ds.GetChildElement(seriesElement, True)Do While Not seriesElement Is NothingseriesInformationElement = ds.FindFirstElement(seriesElement, DicomTag.SeriesInstanceUID, True)If Not seriesInformationElement Is Nothing ThenseriesID = ds.GetConvertValue(seriesInformationElement)If seriesID = seriesInstanceUID ThenReturn seriesInformationElementEnd IfEnd IfseriesElement = ds.GetNextKey(seriesElement, True)seriesElement = ds.GetChildElement(seriesElement, True)LoopReturn NothingEnd 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 StringDim imageIDElement As DicomElement = NothingimageElement = ds.GetChildKey(seriesElement)imageElement = ds.GetChildElement(imageElement, True)Do While Not imageElement Is NothingimageIDElement = ds.FindFirstElement(imageElement, DicomTag.ReferencedFileID, True)If Not imageIDElement Is Nothing ThenReturn directoryPath & "\" & ds.GetConvertValue(imageIDElement)
End IfLoopReturn ""End Function' 返回该系列的下一帧的文件名。Private Function GetNextImageName(ByVal ds As DicomDataSet, ByVal directoryPath As String, ByRef imageElement As DicomElement) As StringDim nextImageElement As DicomElement = NothingimageElement = ds.GetNextKey(imageElement, True)imageElement = ds.GetChildElement(imageElement, True)Do While Not imageElement Is NothingnextImageElement = ds.FindFirstElement(imageElement, DicomTag.ReferencedFileID, True)If Not imageElement Is Nothing ThenDim echoElement As DicomElement = ds.FindFirstElement(imageElement, DicomTag.EchoNumber, True)Return directoryPath & "\" & ds.GetConvertValue(nextImageElement)
End IfLoopReturn ""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 BooleanechoNumber = -1Dim 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 = imagePathimageData.EchoNumber = echoNumberpatientElement = ds.FindFirstElement(Nothing, DicomTag.FrameOfReferenceUID, True)referenceUID = ds.GetConvertValue(patientElement)imageData.FrameOfReferenceUID = referenceUIDpatientElement = 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 ThenimageData.InstanceNumber = Convert.ToInt32(ds.GetConvertValue(patientElement))End IfpatientElement = ds.FindFirstElement(Nothing, DicomTag.InstanceCreationTime, True)If Not patientElement Is Nothing ThenimageData.CaptureTime = Convert.ToDateTime(ds.GetConvertValue(patientElement))End If_imageDataList.Add(imageData)Return TrueEnd FunctionPublic Function Load_Chest_CT_Compressed() As MedicalViewerSeriesManagerDim 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 MedicalViewerSeriesManagerDicomEngine.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 DicomDataSetDim imageIndex As IntegerDim imagePath As StringDim echoNumber As Integer = 0' 现在,该项目将会注意审查该系列中的每一帧。imagePath = GetFirstImageName(ds, _seriesElement, directoryPath, imageElement)imageIndex = 0Do While imageIndex < countTry' 该系列中的每个图像将会被加载。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.ExceptionSystem.Diagnostics.Debug.Assert(False, exception.Message)ThrowEnd TryimageIndex += 1Loop' 根据它的数据对图像进行排序。_seriesManager.Sort(_imageDataList)DicomEngine.Shutdown()Return _seriesManagerEnd 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 RasterImageDim depth As Integer = output.Stacks(0).Items.CountDim index As Integerindex = 0Do While index < depthimage = _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 += 1Loop' 通过调用该方法来总结其创建过程。 object3D.MemoryEfficientEnd(output.Stacks(0).Items(0).ImageOrientationArray, output.Stacks(0).PixelSpacing)End SubDPrivate 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 = NothingDim depth As Integer = output.Stacks(0).Items.CountDim index As Integerindex = 0Do While index < depthIf image Is Nothing Thenimage = _codecs.Load(CStr(output.Stacks(0).Items(index).Data), 0, CodecsLoadByteOrder.BgrOrGrayOrRomm, 1, 1)Elseimage.AddPage(_codecs.Load(CStr(output.Stacks(0).Items(index).Data), 0, CodecsLoadByteOrder.BgrOrGrayOrRomm, 1, 1))End Ifindex += 1Loopcell.Image = imageEnd 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);
- 运行该应用程序。如果您已成功地做到这一切,就可以看到MedicalViewer的一个2X2布局。其左上部包含渲染为3D对象的人类胸腔的一部分。
注意:如果您想要了解有关如何获取上述解锁键的更多相关详细信息,请联系LEAD技术支持团队。
注意:如果您遇到一个“无效的文件格式”或“功能不支持”的异常,请参阅如下主题无效的文件格式/功能不支持。
支持
关于其他产品的更多信息,请访问我们的官方网站,
欢迎下载免费的全功能评估版SDK,全功能试用版中有这个例子的全部源代码。
同时欢迎您使用评估版期间的免费技术支持。