我必须从文件夹中选择所有有效的 DICOM 文件。我可以递归地从具有 *.DCM 扩展名的文件夹中选择所有文件。但是任何带有 *.DCM 的文件也会被拾取,并且此类文件不是有效的 DICOM 文件。
什么是最好的方法。
我想读取文件的几个字节并进行验证。
或者
我们拥有的任何其他方法或任何其他可验证的 EXE。
谢谢你,哈沙
编辑:问题的解决方案:我最后使用了 dcmftest.exe 进行验证。希望我走在正确的轨道上。-哈沙
我必须从文件夹中选择所有有效的 DICOM 文件。我可以递归地从具有 *.DCM 扩展名的文件夹中选择所有文件。但是任何带有 *.DCM 的文件也会被拾取,并且此类文件不是有效的 DICOM 文件。
什么是最好的方法。
我想读取文件的几个字节并进行验证。
或者
我们拥有的任何其他方法或任何其他可验证的 EXE。
谢谢你,哈沙
编辑:问题的解决方案:我最后使用了 dcmftest.exe 进行验证。希望我走在正确的轨道上。-哈沙
您想识别 DICOM 文件,而不是验证。有很大的不同。验证意味着(至少!)其 SOP 类所需的所有标签都存在。
识别很容易,因为 DICOM 文件必须DICM
在偏移量 0x80 处包含文本,因此标签从文件的偏移量 0x84 开始。
请注意,有时只存储序列化数据集(从文件偏移量 0 处的标记组 8 开始),这些更难以识别,但不是标准的。
编辑:例如,考虑一个 RAR 存档。它很容易识别,因为它以Rar!
. 但是,为了确保它是一个有效的 RAR 存档,您必须解压缩所有文件并检查它们的 CRC,而这只能由 RAR 本身完成(而且速度很慢)。
我知道这已经得到了回答,但我有类似的要求,所以我提出了一些扩展方法来做到这一点。适用于文件、文件流、内存流和通用流。仅读取验证文件类型所需的特定 4 个字节。非常高效,我能够在几秒钟内运行数千个文件。
C#
public static class Dicom
{
public static bool IsDicomFile(this Stream s)
{
//Create an empty 4 byte array
byte[] dba = new byte[4];
//Seek to 0x80
s.Seek(128, SeekOrigin.Begin);
//Read the following 4 dba
s.Read(dba, 0, 4);
//Compare to 'DICM'
return dba.SequenceEqual(new byte[4] {68, 73, 67, 77});
}
public static bool IsDicomFile(this MemoryStream ms)
{
return ((Stream)ms).IsDicomFile();
}
public static bool IsDicomFile(this FileStream fs)
{
return ((Stream)fs).IsDicomFile();
}
public static bool IsDicomFile(this FileInfo fi)
{
return fi.OpenRead().IsDicomFile();
}
}
VB.NET
<Extension()> _
Public Function IsDicomFile(ByVal s As Stream) As Boolean
'Create an empty 4 byte array
Dim dba() As Byte = New Byte(3) {}
'Seek to 0x80
s.Seek(128, SeekOrigin.Begin)
'Read the subsequent 4 bytes
s.Read(dba, 0, 4)
'Compare to 'DICM'
Return dba.SequenceEqual(New Byte(3) {68, 73, 67, 77})
End Function
<Extension()> _
Public Function IsDicomFile(ByVal ms As MemoryStream) As Boolean
Return DirectCast(ms, Stream).IsDicomFile
End Function
<Extension()> _
Public Function IsDicomFile(ByVal fs As FileStream) As Boolean
Return DirectCast(fs, Stream).IsDicomFile
End Function
<Extension()> _
Public Function IsDicomFile(ByVal fi As FileInfo) As Boolean
Return fi.OpenRead().IsDicomFile
End Function
仅供参考,具有 .dcm 扩展名的文件并不是真正合法的 DICOM,尽管出于遗留原因,编写程序以接受它们是个好主意(但您不应在应用程序导出的 DICOM 文件上放置 3 个字符的文件扩展名)。根据 DICOM 标准中有关媒体交换的部分,“不得使用 ISO 9660 文件扩展名”。此外,不应从文件名或目录结构中推断出任何语义,除了标准第 10 部分和第 12 部分中描述的特殊 DICOMDIR 文件。
ruslik 的回答为您提供了识别 DICOM 文件的正确方法。如果它在文件序言中的指定位置有 DICM,那么它就是一个 DICOM 文件。否则,它不是。
考虑到不同 IOD 中存在不同的强制和可选标签,验证 DICOM 文件并不是一件容易的事。我认为最好使用现有的解决方案来做到这一点。您可以查看DCMTK 的 DCMCHECK来执行此操作。
对于 Java 用户 dcm4che-工具-dcmvalidate 用法:dcmvalidate --iod [..][..] 根据指定信息对象验证 DICOM 对象的实用程序 定义。 - 选项: -h,--help 显示此帮助并退出 --iod 带有信息对象定义的 xml 文件的路径 -V,--version 输出版本信息并退出 例子: $ dcmvalidate --iod etc/dcmvalidate/dicomdir-iod.xml DICOMDIR 根据 etc/dcmvalidate/dicomdir.xml 中指定的 IOD 验证 DICOMDIR 点击这里查看更多参考
请注意:检查“DICM”的序言只会检查文件是否为 DICOM v3文件。
以前版本的 DICOM 没有序言。可以查看的 100% 有效的 DICOM 文件,带有所有必需的 DICOM 标签等,并且可以导入到 DICOM 节点中,没有序言。
我正在与 OFFIS 核对,看看 DCMCHECK 的许可版本是否也有这个限制,但我还没有收到他们的回复。