LeadTools 使用基準(zhǔn)線
在本教程中,您將學(xué)習(xí)到如何在MedicalViewer 單元格中顯示基準(zhǔn)線。
1. 請(qǐng)您打開Visual Studio2005或一個(gè)更高的版本。
2. 從“文件”菜單中選擇“項(xiàng)目”。
3. 然后會(huì)出現(xiàn)一個(gè)新建項(xiàng)目對(duì)話框。
4. 從“項(xiàng)目類型”中展開“其他語言”節(jié)點(diǎn),然后單擊在“Visual C#” 節(jié)點(diǎn)上。
5. 從該對(duì)話框左側(cè)的模板列表中,選擇“Windows窗體應(yīng)用程序”。
6. 在“項(xiàng)目名稱”字段里輸入該項(xiàng)目的名稱“使用基準(zhǔn)線”,然后選擇“確定”。
7. 選擇“確定”來創(chuàng)建該項(xiàng)目。
8. 從“視圖”菜單中選擇“解決方案資源管理器”。
9. 在“解決方案資源管理器”的樹型圖中,右鍵單擊“引用”節(jié)點(diǎn),然后選擇“添加引用”。
10. 在“添加引用”對(duì)話框中選擇“瀏覽”選項(xiàng)卡,然后添加以下這些DLL文件:
- Leadtools.dll
- Leadtools.Codecs.dll
- Leadtools.MedicalViewer.dll
- Leadtools.Medical3D.dll
- Leadtools.Dicom.dll
- Leadtools.Codecs.Cmp.dll
11. 切換到Form1代碼視圖(在“解決方案資源管理器”上右鍵單擊Form1,然后選擇“查看代碼”),并在文件的開頭添加以下幾行代碼:
Imports Leadtools Imports Leadtools.Codecs Imports Leadtools.MedicalViewer Imports Leadtools.Medical3D Imports Leadtools.Dicom
using Leadtools; using Leadtools.Codecs; using Leadtools.MedicalViewer; using Leadtools.Medical3D; using Leadtools.Dicom;
12. 在Form1中,創(chuàng)建一個(gè)新的方法InitClass() 。并將以下代碼添加到該方法:
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); ' 創(chuàng)建一個(gè)將被用于加載圖像的編解碼器類的新實(shí)例。 Dim _codecs As RasterCodecs = New RasterCodecs() ' 創(chuàng)建一個(gè)MedicalViewer的新實(shí)例。該查看器布局將被劃分為2X2。 Dim viewer As MedicalViewer = New MedicalViewer(2, 2) ' 使該視圖與整個(gè)窗體相匹配。 viewer.Dock = DockStyle.Fill ' 將該查看器添加到窗體。 Controls.Add(viewer) End Sub
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); // 創(chuàng)建一個(gè)將被用于加載圖像的編解碼器類的新實(shí)例。 RasterCodecs _codecs = new RasterCodecs(); // 創(chuàng)建一個(gè)MedicalViewer的新實(shí)例。該查看器布局將被劃分為2X2。 MedicalViewer viewer = new MedicalViewer(2, 2); // 使該視圖與整個(gè)窗體相匹配。 viewer.Dock = DockStyle.Fill; // 將該查看器添加到窗體。 Controls.Add(viewer); }
13. 請(qǐng)從Form1的構(gòu)造函數(shù)中調(diào)用該方法InitClass,并將該調(diào)用放置于InitializeComponent()之后。
14. 運(yùn)行該程序,您將會(huì)看到一個(gè)2x2布局。
15. 注意:在接下來的步驟中,您將需要具備一個(gè)DICOMDIR文件。我們可以提供DICOMDIR示例文件,您可以點(diǎn)擊這里進(jìn)行下載。如果您想要了解有關(guān)如何在DICOMDIR中構(gòu)建3D對(duì)象的更多相關(guān)詳細(xì)信息,請(qǐng)參閱這一章“如何加載DICOMDIR來創(chuàng)建一個(gè)3D對(duì)象”。
注意:如果您遇到一個(gè)“無效的文件格式”或“功能不支持”的異常,請(qǐng)參閱如下主題“無效的文件格式/功能不支持”。
請(qǐng)下載示例DICOMDIR,并將其內(nèi)容解壓縮到此文件夾:C:\Leadtools_DICOMDIR。
16. 請(qǐng)將如下代碼添加到Form1類。該代碼可用于從DICOMDIR中加載圖像,將它們進(jìn)行排序,并從中提取所有的有用信息:
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 ' 您需要找到使用了科目實(shí)例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 ' 您需要找到使用了系列實(shí)例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數(shù)據(jù)集信息,并將其保存到MedicalViewerImageData類的一個(gè)新實(shí)例中。 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_James_CT_Localizer() As MedicalViewerSeriesManager Dim 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 Function Public Function Load_James_CT() As MedicalViewerSeriesManager Dim 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所指定的系列,而這兩個(gè)UID來自fileName指定的文件。 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 ' 在這里,該程序?qū)?huì)對(duì)包含指定的studyInstanceUID的科目進(jìn)行搜索。 _studyElement = FindStudy(ds, studyInstanceUID) ' 在這里,該程序?qū)?huì)對(duì)包含指定的seriesInstanceUID的系列進(jìn)行搜索。 _seriesElement = FindSeries(ds, _studyElement, seriesInstanceUID) ' 請(qǐng)創(chuàng)建一個(gè)MedicalViewerSeriesManager的新實(shí)例。它將被用于對(duì)圖像進(jìn)行排序,以便創(chuàng)建正確的3D對(duì)象。 _seriesManager = New MedicalViewerSeriesManager() ' 請(qǐng)創(chuàng)建一個(gè)MedicalViewerImageData的陣列。該類將被用于保存幀信息。而該信息將被用于對(duì)圖像進(jìn)行排序。 _imageDataList = New List(Of MedicalViewerImageData)() Dim dicomDataSet As DicomDataSet Dim imageIndex As Integer Dim imagePath As String Dim echoNumber As Integer = 0 ' 現(xiàn)在,該程序?qū)?duì)該系列中的每一幀進(jìn)行審查。 imagePath = GetFirstImageName(ds, _seriesElement, directoryPath, imageElement) imageIndex = 0 Do While imageIndex < count Try ' 該系列中的每個(gè)圖像都將被加載。 dicomDataSet = New DicomDataSet() dicomDataSet.Load(imagePath, DicomDataSetLoadFlags.None) ' 該程序可以加載它的信息,并將其保存到MedicalViewerImageData類的一個(gè)新實(shí)例中。 AddImageToImageArray(dicomDataSet, imageIndex, imagePath, echoNumber) dicomDataSet.Dispose() ' 跳轉(zhuǎn)到下一個(gè)圖像。 imagePath = GetNextImageName(ds, directoryPath, imageElement) Catch exception As System.Exception System.Diagnostics.Debug.Assert(False, exception.Message) Throw End Try imageIndex += 1 Loop ' 根據(jù)它的數(shù)據(jù)對(duì)這些圖像進(jìn)行排序。 _seriesManager.Sort(_imageDataList) DicomEngine.Shutdown() Return _seriesManager End Function Private Sub LoadLocalizer(ByVal cell As MedicalViewerMultiCell) ' 啟動(dòng)允許加載各種圖像的編解碼器。 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) ' 設(shè)置以下三行代碼非常重要。否則,可能會(huì)發(fā)生基準(zhǔn)線結(jié)果錯(cuò)誤。 ' 設(shè)置定位器的圖像位置。 cell.SetImagePosition(0, _seriesManager.Localizers(0).LocalizerData.ImagePosition, True) ' 設(shè)置定位器的圖像方向。 cell.ImageOrientation = _seriesManager.Localizers(0).LocalizerData.ImageOrientationArray ' 設(shè)置定位器的像素間隔。 cell.PixelSpacing = _seriesManager.Localizers(0).LocalizerData.PixelSpacing ' 設(shè)置定位器的幀引用UID。如果系列和定位器具有相同的引用UID的話,這樣就可以在它們之間創(chuàng)建一條基準(zhǔn)線。 cell.FrameOfReferenceUID = _seriesManager.Localizers(0).LocalizerData.FrameOfReferenceUID End Sub Private Sub Load2DCell(ByVal cell As MedicalViewerMultiCell) ' 啟動(dòng)允許加載各種圖像的編解碼器。 Dim _codecs As RasterCodecs = New RasterCodecs() ' 加載CT DICOMDIR,并返回排列好的圖像集合。 output = Load_James_CT() ' 循環(huán)處理這些圖像,并將它們一個(gè)接一個(gè)地添加到最終的圖像。 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 ' 設(shè)置以下這幾行代碼非常重要。否則,可能會(huì)出現(xiàn)基準(zhǔn)線結(jié)果錯(cuò)誤。 index = 0 Do While index < depth ' 設(shè)置每幀的圖像位置。 cell.SetImagePosition(index, _seriesManager.Stacks(0).Items(index).ImagePosition, False) index += 1 Loop ' 請(qǐng)對(duì)該系列的圖像方向進(jìn)行設(shè)置,且它只需被設(shè)置一次,因?yàn)樗械膸仨毦哂邢嗤姆较蛑怠? cell.ImageOrientation = _seriesManager.Stacks(0).Items(0).ImageOrientationArray ' 請(qǐng)對(duì)該系列的像素間隔進(jìn)行設(shè)置,且它只需被設(shè)置一次,因?yàn)樗械膸仨毦哂邢嗤南袼亻g隔值。 cell.PixelSpacing = _seriesManager.Stacks(0).Items(0).PixelSpacing ' 請(qǐng)對(duì)該系列的幀引用UID進(jìn)行設(shè)置。如果該系列和定位器具有相同的引用UID的話,這將在它們之間創(chuàng)建一條基準(zhǔn)線。 cell.FrameOfReferenceUID = _seriesManager.Stacks(0).Items(0).FrameOfReferenceUID End Sub
DicomElement _studyElement; DicomElement _seriesElement; MedicalViewerSeriesManager _seriesManager; List<MedicalViewerImageData> _imageDataList; double[] doubleArray; DicomElement patientElement; string referenceUID; DicomElement imageElement; MedicalViewerSeriesManager output; // 您需要找到使用了科目實(shí)例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; } // 您需要找到使用了系列實(shí)例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數(shù)據(jù)集信息,并將其保存到MedicalViewerImageData類的一個(gè)新實(shí)例中。 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所指定的系列,而這兩個(gè)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; // 在這里,該程序?qū)?huì)對(duì)包含指定的studyInstanceUID的科目進(jìn)行搜索。 _studyElement = FindStudy(ds, studyInstanceUID); // 在這里,該程序?qū)?huì)對(duì)包含指定的seriesInstanceUID的系列進(jìn)行搜索。 _seriesElement = FindSeries(ds, _studyElement, seriesInstanceUID); // 請(qǐng)創(chuàng)建一個(gè)MedicalViewerSeriesManager的新實(shí)例。它將被用于對(duì)圖像進(jìn)行排序,以便創(chuàng)建正確的3D對(duì)象。 _seriesManager = new MedicalViewerSeriesManager(); // 請(qǐng)創(chuàng)建一個(gè)MedicalViewerImageData的陣列。該類將被用于保存幀信息。而該信息將被用于對(duì)圖像進(jìn)行排序。 _imageDataList = new List<MedicalViewerImageData>(); DicomDataSet dicomDataSet; int imageIndex; string imagePath; int echoNumber = 0; // 現(xiàn)在,該程序?qū)?duì)該系列中的每一幀進(jìn)行審查。 imagePath = GetFirstImageName(ds, _seriesElement, directoryPath, out imageElement); for (imageIndex = 0; imageIndex < count; imageIndex++) { try { // 該系列中的每個(gè)圖像都將被加載。 dicomDataSet = new DicomDataSet(); dicomDataSet.Load(imagePath, DicomDataSetLoadFlags.None); // 該程序可以加載它的信息,并將其保存到MedicalViewerImageData類的一個(gè)新實(shí)例中。 AddImageToImageArray(dicomDataSet, imageIndex, imagePath, out echoNumber); dicomDataSet.Dispose(); // 跳轉(zhuǎn)到下一個(gè)圖像。 imagePath = GetNextImageName(ds, directoryPath, ref imageElement); } catch (System.Exception exception) { System.Diagnostics.Debug.Assert(false, exception.Message); throw; } } // 根據(jù)它的數(shù)據(jù)對(duì)這些圖像進(jìn)行排序。 _seriesManager.Sort(_imageDataList); DicomEngine.Shutdown(); return _seriesManager; } void LoadLocalizer(MedicalViewerMultiCell cell) { // 啟動(dòng)允許加載各種圖像的編解碼器。 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); // 設(shè)置以下三行代碼非常重要。否則,可能會(huì)發(fā)生基準(zhǔn)線結(jié)果錯(cuò)誤。 // 設(shè)置定位器的圖像位置。 cell.SetImagePosition(0, _seriesManager.Localizers[0].LocalizerData.ImagePosition, true); // 設(shè)置定位器的圖像方向。 cell.ImageOrientation = _seriesManager.Localizers[0].LocalizerData.ImageOrientationArray; // 設(shè)置定位器的像素間隔。 cell.PixelSpacing = _seriesManager.Localizers[0].LocalizerData.PixelSpacing; // 設(shè)置定位器的幀引用UID。如果該系列和定位器具有相同的引用UID的話,這樣就可以在它們之間創(chuàng)建一條基準(zhǔn)線。 cell.FrameOfReferenceUID = _seriesManager.Localizers[0].LocalizerData.FrameOfReferenceUID; } void Load2DCell(MedicalViewerMultiCell cell) { // 啟動(dòng)允許加載各種圖像的編解碼器。 RasterCodecs _codecs = new RasterCodecs(); // 加載CT DICOMDIR,并返回排列好的圖像集合。 output = Load_James_CT(); // 循環(huán)處理這些圖像,并將它們一個(gè)接一個(gè)地添加到最終的圖像。 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; // 設(shè)置以下這幾行代碼非常重要。否則,可能會(huì)出現(xiàn)基準(zhǔn)線結(jié)果錯(cuò)誤。 for (index = 0; index < depth; index++) { // 設(shè)置每幀的圖像位置。. cell.SetImagePosition(index, _seriesManager.Stacks[0].Items[index].ImagePosition, false); } // 請(qǐng)對(duì)該系列的圖像方向進(jìn)行設(shè)置,且它只需被設(shè)置一次,因?yàn)樗械膸仨毦哂邢嗤姆较蛑怠? cell.ImageOrientation = _seriesManager.Stacks[0].Items[0].ImageOrientationArray; // 請(qǐng)對(duì)該系列的像素間隔進(jìn)行設(shè)置,且它只需被設(shè)置一次,因?yàn)樗械膸仨毦哂邢嗤南袼亻g隔值。. cell.PixelSpacing = _seriesManager.Stacks[0].Items[0].PixelSpacing; // 請(qǐng)對(duì)該系列的幀引用UID進(jìn)行設(shè)置。如果該系列和定位器具有相同的引用UID的話,這將在它們之間創(chuàng)建一條基準(zhǔn)線。 cell.FrameOfReferenceUID = _seriesManager.Stacks[0].Items[0].FrameOfReferenceUID; }
17. 將如下幾行代碼添加到InitClass()方法的末尾(這將創(chuàng)建一個(gè)新的單元格,并將指定的系列填充到其中):
' 創(chuàng)建一個(gè)包含圖像集合的單元格。 Dim cell As MedicalViewerMultiCell = New MedicalViewerMultiCell() ' 加載該圖像集合。 Load2DCell(cell)
//創(chuàng)建一個(gè)包含圖像集合的單元格。 MedicalViewerMultiCell cell = new MedicalViewerMultiCell(); // 加載該圖像集合。 Load2DCell(cell);
18. 將如下幾行代碼添加到InitClass()方法的末尾(這將創(chuàng)建一個(gè)新的單元格,并將一個(gè)被稱為定位器的幀填充到其中):
' 創(chuàng)建一個(gè)包含定位器的單元格。 Dim localizerCell As MedicalViewerMultiCell = New MedicalViewerMultiCell() ' 加載該定位器。 LoadLocalizer(localizerCell)
// 創(chuàng)建一個(gè)包含定位器的單元格。 MedicalViewerMultiCell localizerCell = new MedicalViewerMultiCell(); // 加載該定位器。 LoadLocalizer(localizerCell);
19. 現(xiàn)在,將這兩個(gè)單元格(系列單元格和定位器單元格)添加到MedicalViewer。為了做到這一點(diǎn),請(qǐng)將如下這幾行代碼添加到InitClass()方法的末尾:
' 將以上的多幀單元格添加到MedicalViewer。 viewer.Cells.Add(cell) ' 將以上的定位器單元格添加到MedicalViewer。 viewer.Cells.Add(localizerCell)
// 將以上的多幀單元格添加到MedicalViewer。 viewer.Cells.Add(cell); // 將以上的定位器單元格添加到MedicalViewer。 viewer.Cells.Add(localizerCell);
20. 最后,您需要同時(shí)啟用這兩個(gè)單元格的基準(zhǔn)線。為了做到這一點(diǎn),您只需要將以下這幾行代碼添加到InitClass()方法的末尾:
' 在定位器圖像中啟用基準(zhǔn)線。 cell.ReferenceLine.Enabled = True ' 在圖像集合中啟用基準(zhǔn)線。 localizerCell.ReferenceLine.Enabled = True
// 在定位器圖像中啟用基準(zhǔn)線。 cell.ReferenceLine.Enabled = true; // 在圖像集合中啟用基準(zhǔn)線。 localizerCell.ReferenceLine.Enabled = true;
21. 如果您運(yùn)行該程序,現(xiàn)在您將看到兩個(gè)單元格:一個(gè)上面繪制有一條垂直線,而另外一個(gè)上面繪制有一條水平線。
關(guān)于其他產(chǎn)品的更多信息,請(qǐng)查看產(chǎn)品詳情。
文自:葡萄城