在本教程中,您将学习到应该如何创建一个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 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);
}
- 请从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 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);
- 运行该应用程序。如果您已成功地做到这一切,就可以看到MedicalViewer的一个2X2布局。其左上部包含渲染为3D对象的人类胸腔的一部分。
注意:如果您想要了解有关如何获取上述解锁键的更多相关详细信息,请联系LEAD技术支持团队。
注意:如果您遇到一个“无效的文件格式”或“功能不支持”的异常,请参阅如下主题无效的文件格式/功能不支持。
支持
关于其他产品的更多信息,请访问我们的官方网站,
欢迎下载免费的全功能评估版SDK,全功能试用版中有这个例子的全部源代码。
同时欢迎您使用评估版期间的免费技术支持。