在本教程中,您将学习到如何在MedicalViewer 单元格中显示基准线。
1. 请您打开Visual Studio2005或一个更高的版本。
- 从“文件”菜单中选择“项目”。
- 然后会出现一个新建项目对话框。
- 从“项目类型”中展开“其他语言”节点,然后单击在“Visual C#” 节点上。
- 从该对话框左侧的模板列表中,选择“Windows窗体应用程序”。
- 在“项目名称”字段里输入该项目的名称“使用基准线”,然后选择“确定”。
- 选择“确定”来创建该项目。
- 从“视图”菜单中选择“解决方案资源管理器”。
- 在“解决方案资源管理器”的树型图中,右键单击“引用”节点,然后选择“添加引用”。
- 在“添加引用”对话框中选择“浏览”选项卡,然后添加以下这些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()' 创建一个MedicalViewer的新实例。该查看器布局将被划分为2X2。Dim viewer As MedicalViewer = New MedicalViewer(2, 2)' 使该视图与整个窗体相匹配。viewer.Dock = DockStyle.Fill' 将该查看器添加到窗体。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();// 创建一个MedicalViewer的新实例。该查看器布局将被划分为2X2。
MedicalViewer viewer = new MedicalViewer(2, 2);// 使该视图与整个窗体相匹配。
viewer.Dock = DockStyle.Fill;// 将该查看器添加到窗体。
Controls.Add(viewer);}
13.请从Form1的构造函数中调用该方法InitClass,并将该调用放置于InitializeComponent()之后。
14.运行该程序,您将会看到一个2x2布局。
15.注意:在接下来的步骤中,您将需要具备一个DICOMDIR文件。我们可以提供DICOMDIR示例文件,您可以点击这里进行下载。如果您想要了解有关如何在DICOMDIR中构建3D对象的更多相关详细信息,请参阅这一章“如何加载DICOMDIR来创建一个3D对象”。
注意:如果您遇到一个“无效的文件格式”或“功能不支持”的异常,请参阅如下主题“无效的文件格式/功能不支持”。
请下载示例DICOMDIR,并将其内容解压缩到此文件夹:C:\Leadtools_DICOMDIR。
16.请将如下代码添加到Form1类。该代码可用于从DICOMDIR中加载图像,将它们进行排序,并从中提取所有的有用信息:
[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_James_CT_Localizer() As MedicalViewerSeriesManagerDim fileName As String = "C:\Leadtools_DICOMDIR\Miller James\"
Dim studyInstanceUID As String = "1.3.12.2.1107.5.1.4.50772.30000009122208074910900000022"
Dim seriesInstanceUID As String = "1.3.12.2.1107.5.1.4.50772.30000009122208074910900000023"
Return LoadSeries(fileName, studyInstanceUID, seriesInstanceUID, 1)End FunctionPublic Function Load_James_CT() As MedicalViewerSeriesManagerDim fileName As String = "C:\Leadtools_DICOMDIR\Miller James\"
Dim studyInstanceUID As String = "1.3.12.2.1107.5.1.4.50772.30000009122208074910900000022"
Dim seriesInstanceUID As String = "1.3.12.2.1107.5.1.4.50772.30000009122208215356200001997"
Return LoadSeries(fileName, studyInstanceUID, seriesInstanceUID, 256)End Function' 这将加载由seriesInstanceUID和studyInstanceUID所指定的系列,而这两个UID来自fileName指定的文件。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 FunctionPrivate Sub LoadLocalizer(ByVal cell As MedicalViewerMultiCell)' 启动允许加载各种图像的编解码器。Dim _codecs As RasterCodecs = New RasterCodecs()' 加载CT定位器。output = Load_James_CT_Localizer()cell.Image = _codecs.Load(CStr(output.Localizers(0).LocalizerData.Data), 0, CodecsLoadByteOrder.BgrOrGrayOrRomm, 1, 1)' 设置以下三行代码非常重要。否则,可能会发生基准线结果错误。' 设置定位器的图像位置。cell.SetImagePosition(0, _seriesManager.Localizers(0).LocalizerData.ImagePosition, True)' 设置定位器的图像方向。cell.ImageOrientation = _seriesManager.Localizers(0).LocalizerData.ImageOrientationArray' 设置定位器的像素间隔。cell.PixelSpacing = _seriesManager.Localizers(0).LocalizerData.PixelSpacing' 设置定位器的帧引用UID。如果系列和定位器具有相同的引用UID的话,这样就可以在它们之间创建一条基准线。cell.FrameOfReferenceUID = _seriesManager.Localizers(0).LocalizerData.FrameOfReferenceUIDEnd SubPrivate Sub Load2DCell(ByVal cell As MedicalViewerMultiCell)' 启动允许加载各种图像的编解码器。Dim _codecs As RasterCodecs = New RasterCodecs()' 加载CT DICOMDIR,并返回排列好的图像集合。output = Load_James_CT()' 循环处理这些图像,并将它们一个接一个地添加到最终的图像。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 = image' 设置以下这几行代码非常重要。否则,可能会出现基准线结果错误。index = 0Do While index < depth' 设置每帧的图像位置。cell.SetImagePosition(index, _seriesManager.Stacks(0).Items(index).ImagePosition, False)index += 1Loop' 请对该系列的图像方向进行设置,且它只需被设置一次,因为所有的帧必须具有相同的方向值。cell.ImageOrientation = _seriesManager.Stacks(0).Items(0).ImageOrientationArray' 请对该系列的像素间隔进行设置,且它只需被设置一次,因为所有的帧必须具有相同的像素间隔值。cell.PixelSpacing = _seriesManager.Stacks(0).Items(0).PixelSpacing' 请对该系列的帧引用UID进行设置。如果该系列和定位器具有相同的引用UID的话,这将在它们之间创建一条基准线。cell.FrameOfReferenceUID = _seriesManager.Stacks(0).Items(0).FrameOfReferenceUIDEnd Sub[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_James_CT_Localizer(){string fileName = @"C:\Leadtools_DICOMDIR\Miller James\";
string studyInstanceUID = "1.3.12.2.1107.5.1.4.50772.30000009122208074910900000022";
string seriesInstanceUID = "1.3.12.2.1107.5.1.4.50772.30000009122208074910900000023";
return LoadSeries(fileName, studyInstanceUID, seriesInstanceUID, 1);
}public MedicalViewerSeriesManager Load_James_CT(){string fileName = @"C:\Leadtools_DICOMDIR\Miller James\";
string studyInstanceUID = "1.3.12.2.1107.5.1.4.50772.30000009122208074910900000022";
string seriesInstanceUID = "1.3.12.2.1107.5.1.4.50772.30000009122208215356200001997";
return LoadSeries(fileName, studyInstanceUID, seriesInstanceUID, 256);
}// 这将加载由seriesInstanceUID和studyInstanceUID所指定的系列,而这两个UID来自fileName指定的文件。
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;
}void LoadLocalizer(MedicalViewerMultiCell cell)
{// 启动允许加载各种图像的编解码器。
RasterCodecs _codecs = new RasterCodecs();// 加载CT定位器。
output = Load_James_CT_Localizer();cell.Image = _codecs.Load((string)output.Localizers[0].LocalizerData.Data, 0, CodecsLoadByteOrder.BgrOrGrayOrRomm, 1, 1);// 设置以下三行代码非常重要。否则,可能会发生基准线结果错误。
// 设置定位器的图像位置。
cell.SetImagePosition(0, _seriesManager.Localizers[0].LocalizerData.ImagePosition, true);// 设置定位器的图像方向。
cell.ImageOrientation = _seriesManager.Localizers[0].LocalizerData.ImageOrientationArray;// 设置定位器的像素间隔。
cell.PixelSpacing = _seriesManager.Localizers[0].LocalizerData.PixelSpacing;// 设置定位器的帧引用UID。如果该系列和定位器具有相同的引用UID的话,这样就可以在它们之间创建一条基准线。
cell.FrameOfReferenceUID = _seriesManager.Localizers[0].LocalizerData.FrameOfReferenceUID;}void Load2DCell(MedicalViewerMultiCell cell)
{// 启动允许加载各种图像的编解码器。
RasterCodecs _codecs = new RasterCodecs();// 加载CT DICOMDIR,并返回排列好的图像集合。
output = Load_James_CT();// 循环处理这些图像,并将它们一个接一个地添加到最终的图像。
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;// 设置以下这几行代码非常重要。否则,可能会出现基准线结果错误。 for (index = 0; index < depth; index++)
{// 设置每帧的图像位置。.
cell.SetImagePosition(index, _seriesManager.Stacks[0].Items[index].ImagePosition, false);}// 请对该系列的图像方向进行设置,且它只需被设置一次,因为所有的帧必须具有相同的方向值。
cell.ImageOrientation = _seriesManager.Stacks[0].Items[0].ImageOrientationArray;// 请对该系列的像素间隔进行设置,且它只需被设置一次,因为所有的帧必须具有相同的像素间隔值。.
cell.PixelSpacing = _seriesManager.Stacks[0].Items[0].PixelSpacing;// 请对该系列的帧引用UID进行设置。如果该系列和定位器具有相同的引用UID的话,这将在它们之间创建一条基准线。
cell.FrameOfReferenceUID = _seriesManager.Stacks[0].Items[0].FrameOfReferenceUID;}
17.将如下几行代码添加到InitClass()方法的末尾(这将创建一个新的单元格,并将指定的系列填充到其中):
[Visual Basic]' 创建一个包含图像集合的单元格。Dim cell As MedicalViewerMultiCell = New MedicalViewerMultiCell()' 加载该图像集合。Load2DCell(cell)[C#]//创建一个包含图像集合的单元格。
MedicalViewerMultiCell cell = new MedicalViewerMultiCell();// 加载该图像集合。
Load2DCell(cell);
18.将如下几行代码添加到InitClass()方法的末尾(这将创建一个新的单元格,并将一个被称为定位器的帧填充到其中):
[Visual Basic]' 创建一个包含定位器的单元格。Dim localizerCell As MedicalViewerMultiCell = New MedicalViewerMultiCell()' 加载该定位器。LoadLocalizer(localizerCell)[C#]// 创建一个包含定位器的单元格。
MedicalViewerMultiCell localizerCell = new MedicalViewerMultiCell();// 加载该定位器。
LoadLocalizer(localizerCell);
19.现在,将这两个单元格(系列单元格和定位器单元格)添加到MedicalViewer。为了做到这一点,请将如下这几行代码添加到InitClass()方法的末尾:
[Visual Basic]' 将以上的多帧单元格添加到MedicalViewer。viewer.Cells.Add(cell)' 将以上的定位器单元格添加到MedicalViewer。viewer.Cells.Add(localizerCell)[C#]// 将以上的多帧单元格添加到MedicalViewer。
viewer.Cells.Add(cell);// 将以上的定位器单元格添加到MedicalViewer。
viewer.Cells.Add(localizerCell);
20.最后,您需要同时启用这两个单元格的基准线。为了做到这一点,您只需要将以下这几行代码添加到InitClass()方法的末尾:
[Visual Basic]' 在定位器图像中启用基准线。cell.ReferenceLine.Enabled = True' 在图像集合中启用基准线。localizerCell.ReferenceLine.Enabled = True[C#]// 在定位器图像中启用基准线。
cell.ReferenceLine.Enabled = true;// 在图像集合中启用基准线。
localizerCell.ReferenceLine.Enabled = true;
21.如果您运行该程序,现在您将看到两个单元格:一个上面绘制有一条垂直线,而另外一个上面绘制有一条水平线。
支持
关于其他产品的更多信息,请访问我们的官方网站,
欢迎下载免费的全功能评估版SDK,全功能试用版中有这个例子的全部源代码。
同时欢迎您使用评估版期间的免费技术支持。