• <menu id="w2i4a"></menu>
  • logo LEADTOOLS使用教程

    文檔首頁>>LEADTOOLS使用教程>>LeadTools 使用基準(zhǔn)線

    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)品詳情。

    文自:葡萄城

    掃碼咨詢


    添加微信 立即咨詢

    電話咨詢

    客服熱線
    023-68661681

    TOP
    三级成人熟女影院,欧美午夜成人精品视频,亚洲国产成人乱色在线观看,色中色成人论坛 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();