C#gdcm加载dicom

C#gdcm加载dicom,c#,dicom,C#,Dicom,GDMCGDMPINVOKE有一个异常。为什么? foreach (string el in files_in_folder) { try { gdcm.ImageReader reader = new gdcm.ImageReader(); reader.SetFileName(el); if (reader.Read()) { textBox1.Text="Image loaded";

GDMCGDMPINVOKE有一个异常。为什么?

foreach (string el in files_in_folder)
{
    try
    {
        gdcm.ImageReader reader = new gdcm.ImageReader();
        reader.SetFileName(el);

        if (reader.Read())
        {
            textBox1.Text="Image loaded"; 

            reader.GetImage() ;

            ListViewItem str = new ListViewItem(el);

            str.Text = el;

            listView1.Items.Add(str.Text);
        }
        else
        {
            textBox1.Text = "This is not a DICOM file";
        }
    }
}

我建议不要在这个任务中使用任何DICOM阅读器,因为这会给这个过程增加很大的开销。在本例中使用完整DICOM库的唯一原因是,如果要验证文件的所有元素,并确保文件实际上是DICOM文件

我的第一个建议是简单地依靠文件扩展名(通常是“.DCM”)来初步识别DICOM文件。然后,如果文件格式不正确,请在用户尝试打开文件时通知用户。我知道没有其他文件格式使用“.DCM”扩展名

如果这是不可接受的(比如您的文件没有扩展名),我只会对您的特定用例进行最低限度的验证。DICOM文件始终包含128字节的前导码,后跟字母“DICM”(不带引号)。您可以用任何想要的内容填充前导,但字节129-132必须始终包含“DICM”。这是最低限度的文件验证,我建议如下:

foreach (string el in files_in_folder)
{
    bool isDicomFile = false;
    using (FileStream fs = new FileStream(el, FileMode.Open))
    {
        byte[] b = new byte[4];
        fs.Read(b, 128, b.Length);
        ASCIIEncoding enc = new ASCIIEncoding();
        string verification = enc.GetString(b);
        if (verification == "DICM")
            isDicomFile = true;
        fs.Close();
    }
    if (isDicomFile)
        listView1.Items.Add(new ListViewItem(el));
    // I would discourage the use of this else, since even
    // if only one file in the list fails, the TextBox.Text
    // will still be set to "This is not a DICOM file".
    else
        textBox1.Text = "This is not a DICOM file";
}

在过去的几天里,我看到了(并发布了)你提出的几个问题。有没有什么特别的原因让你用GDCM来做这个,而用openDicom来做其他的事情呢。在我看来,导入两个极其相似的DICOM库将是多余的,并且比它所能提供的任何帮助都更加混乱。我强烈建议您只选择一个库,然后根据需要扩展它。此外,当您使用
ListViewItem(字符串文本)
构造函数创建新的
ListViewItem
时,您无需设置新ListViewItem的
text
属性,因为它已经由构造函数中使用的字符串设置。检查DICM幻数只能确保这是一个有效的PS 3.10文件。这并不意味着该文件包含DICOM数据集。@malat-True,但这比通过加载并编目来逐个验证每个数据集要好。@nathan,对不起,我太回避了,我的意思是: