0

gdmcgdcmPinvokeには例外があります。なんで?

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";
        }
    }
}
4

1 に答える 1

1

プロセスにかなりのオーバーヘッドが追加されるため、このタスクにはDICOMリーダーを使用しないことをお勧めします。この場合に完全なDICOMライブラリを使用する唯一の理由は、ファイルのすべての要素を検証し、ファイルが実際にDICOMファイルであることを確認する場合です。

私の最初の提案は、最初にDICOMファイルを識別するためにファイル拡張子(通常は「.DCM」)に依存することです。次に、ファイルが正しい形式でない場合は、ファイルを開こうとしたときにユーザーに通知します。「.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";
}
于 2010-09-08T18:37:46.423 に答える