2011-02-09 243 views
-1

你能告訴我如何讀取C#中的所有dicom標籤及其VR嗎?在c中讀取dicom文件標籤#

+1

這個問題也關係:HTTP://計算器.com/questions/2381983/c-how-to-read-parts-of-file-dicom – 2011-02-10 17:32:17

回答

1

這是當然的,完全取決於什麼DICOM你正在使用的庫。

使用ClearCanvas你有這樣的事情:

public foo(DicomFile dfile) 
{ 
    DicomAttributeCollection dac; 
    dac = dfile.DataSet; 

    DicomUid uid; 
    bool success; 
    success = dac[DicomTags.SopInstanceUid].TryGetUid(0, out uid); 

    if (success) 
    { 
     // The attribute was present in the collection. The variable uid 
     // contains the SopInstanceUid extracted from the DICOM file 
    } 
} 

與不同VR的其他屬性將使用DicomTags的相應字段中提取,並在VR適當的getter函數。例如,如果您想要將EchoTime(具有DS值表示的屬性)提取爲double,則可以使用TryGetFloat64而不是TryGetUid。 TryGetFloat64(和其他類似函數)的第一個整數參數指示您想要獲取的特定值。對於數值爲1的屬性,此參數始終爲0.對於VM> 1的屬性,通過將參數設置爲n-1,可以提取第n個值。

1

如果您正在使用GDCM + C#綁定:

http://gdcm.sourceforge.net/html/SimplePrint_8cs-example.html

public class SimplePrint 
{ 
    public static void RecurseDataSet(File f, DataSet ds, string indent) 
    { 
    CSharpDataSet cds = new CSharpDataSet(ds); 
    while(!cds.IsAtEnd()) 
     { 
     DataElement de = cds.GetCurrent(); 
     // Compute VR from the toplevel file, and the currently processed dataset: 
     VR vr = DataSetHelper.ComputeVR(f, ds, de.GetTag()); 

     if(vr.Compatible(new VR(VR.VRType.SQ))) 
     { 
     uint uvl = (uint)de.GetVL(); // Test cast is ok 
     System.Console.WriteLine(indent + de.GetTag().toString() + ":" + uvl); // why not ? 
     //SequenceOfItems sq = de.GetSequenceOfItems(); 
     // GetValueAsSQ handle more cases than GetSequenceOfItems 
     SmartPtrSQ sq = de.GetValueAsSQ(); 
     uint n = sq.GetNumberOfItems(); 
     for(uint i = 1; i <= n; i++) // item starts at 1, not 0 
      { 
      Item item = sq.GetItem(i); 
      DataSet nested = item.GetNestedDataSet(); 
      RecurseDataSet(f, nested, indent + " "); 
      } 
     } 
     else 
     { 
     System.Console.WriteLine(indent + de.toString()); 
     } 
     cds.Next(); 
     } 
    } 

    public static int Main(string[] args) 
    { 
    string filename = args[0]; 
    Reader reader = new Reader(); 
    reader.SetFileName(filename); 
    bool ret = reader.Read(); 
    if(!ret) 
     { 
     return 1; 
     } 
    File f = reader.GetFile(); 
    DataSet ds = f.GetDataSet(); 

    RecurseDataSet(f, ds, ""); 

    return 0; 
    } 
} 
1

Evil Dicom它是很容易:

 //All the work is done with this constructor 
     DicomFile df = new DicomFile("fileToRead.dcm"); 
     foreach (DicomObject d in df.DicomObjects) 
     { 
      Console.WriteLine(string.Format("I have a tag id of {0}, a VR of {1}", d.Tag.Id, d.VR));   
     } 

     //To access the data in a native format use .Data property 
     string name = df.PATIENT_NAME.Data; 
1

我使用LEADTOOLS

private DicomDataSet _objLTDicomDataSet = null; 
private void OpenDataset(string file, bool loadDefaultImage) 
     { 
      _objLTDicomDataSet =new DicomDataSet(); 
      _objLTDicomDataSet.Load(file, DicomDataSetLoadFlags.None); 
      DicomElement element, _ele = null; 
      element = _objLTDicomDataSet.FindFirstElement(null, DicomTag.PatientName, true); 
      string tagName = _objLTDicomDataSet.GetStringValue(element, 0); 
     } 
實現它

也LEADTOOLS支持獲取各種標籤的各種方法,你可以使用的方法和讀取DICOM文件的方法如下

DicomDataSet.GetRootElement 

DicomDataSet.GetParentElement 

DicomDataSet.GetChildElement 

DicomDataSet.GetFirstElement 

DicomDataSet.GetLastElement 

DicomDataSet.GetPreviousElement 

DicomDataSet.GetNextElement 

更多信息LeadTools網站

+0

感謝您的幫助:)) – 2013-07-26 10:07:02