使用 MyDICOM 从 DICOM 中提取嵌入式 xml 文件
Extract an embedded xml file from a DICOM using MyDICOM
我正在接收带有嵌入式 xml 结果文件的 DICOM 图像。我可以使用 DVTk 找到 xml 应该位于的标签,但我无法弄清楚如何使用 MyDICOM 提取它。
我无法共享 DICOM,因为它包含专有信息,而且我没有获得许可。我希望有使用 MyDICOM 的经验的人可以提供帮助。
我怀疑我所拥有的发布代码是否会对任何人有所帮助,但我还是会这样做:
if (element.ValueRepresentation.ToString().ToLower().Equals("ob"))
{
DeferredStream stream = element.Get(0) as DeferredStream;
MyDicom.StreamReader reader = new MyDicom.StreamReader(stream, dicom.MetaData.Tsn);
reader.UseDeferredStream = true;
reader.EnforceEvenByteSizeElement = dicom.EnforceEvenByteSize;
if (dicom.PrivateDictionary != null)
reader.PrivateDictionary = dicom.PrivateDictionary;
//object embedded = reader.Deserialize(this.dataSetStartTag, this.dataSetEndTag);
}
我不确定这段代码是否真的有效,即使有效,我也没有开始和结束标记。我没有提供太多信息,所以我期望不高,但我很乐意在正确的方向上得到一点推动。
这不是正确的方法,但这是我在没有 MyDICOM 适当文档的情况下能够找到的唯一方法。我将流加载到一个字符串中,然后搜索我需要的信息。
// Set up the stream
object elem = element.Get(0);
if (elem is DeferredStream)
stream = elem as DeferredStream;
else if (elem is MemoryStream)
stream = elem as MemoryStream;
// Set up the stream reader
reader = new MyDicom.StreamReader(stream, dicom.MetaData.Tsn);
reader.UseDeferredStream = (elem is DeferredStream);
reader.EnforceEvenByteSizeElement = dicom.EnforceEvenByteSize;
if (dicom.PrivateDictionary != null)
reader.PrivateDictionary = dicom.PrivateDictionary;
// Read the Stream into a String
byte[] read = reader.ReadBytes(Convert.ToInt32(stream.Length));
String data = System.Text.Encoding.Default.GetString(read);
int start = data.IndexOf("<PatientData>");
int length = data.Substring(start).IndexOf("</PatientData>") + 15;
if (start > 0 && length > 0)
result = data.Substring(start, length);
else
result = "";
我担心这种方法的速度和准确性,所以如果有人知道正确的方法,仍然欢迎。否则,我会将其标记为完成。
我正在接收带有嵌入式 xml 结果文件的 DICOM 图像。我可以使用 DVTk 找到 xml 应该位于的标签,但我无法弄清楚如何使用 MyDICOM 提取它。
我无法共享 DICOM,因为它包含专有信息,而且我没有获得许可。我希望有使用 MyDICOM 的经验的人可以提供帮助。
我怀疑我所拥有的发布代码是否会对任何人有所帮助,但我还是会这样做:
if (element.ValueRepresentation.ToString().ToLower().Equals("ob"))
{
DeferredStream stream = element.Get(0) as DeferredStream;
MyDicom.StreamReader reader = new MyDicom.StreamReader(stream, dicom.MetaData.Tsn);
reader.UseDeferredStream = true;
reader.EnforceEvenByteSizeElement = dicom.EnforceEvenByteSize;
if (dicom.PrivateDictionary != null)
reader.PrivateDictionary = dicom.PrivateDictionary;
//object embedded = reader.Deserialize(this.dataSetStartTag, this.dataSetEndTag);
}
我不确定这段代码是否真的有效,即使有效,我也没有开始和结束标记。我没有提供太多信息,所以我期望不高,但我很乐意在正确的方向上得到一点推动。
这不是正确的方法,但这是我在没有 MyDICOM 适当文档的情况下能够找到的唯一方法。我将流加载到一个字符串中,然后搜索我需要的信息。
// Set up the stream
object elem = element.Get(0);
if (elem is DeferredStream)
stream = elem as DeferredStream;
else if (elem is MemoryStream)
stream = elem as MemoryStream;
// Set up the stream reader
reader = new MyDicom.StreamReader(stream, dicom.MetaData.Tsn);
reader.UseDeferredStream = (elem is DeferredStream);
reader.EnforceEvenByteSizeElement = dicom.EnforceEvenByteSize;
if (dicom.PrivateDictionary != null)
reader.PrivateDictionary = dicom.PrivateDictionary;
// Read the Stream into a String
byte[] read = reader.ReadBytes(Convert.ToInt32(stream.Length));
String data = System.Text.Encoding.Default.GetString(read);
int start = data.IndexOf("<PatientData>");
int length = data.Substring(start).IndexOf("</PatientData>") + 15;
if (start > 0 && length > 0)
result = data.Substring(start, length);
else
result = "";
我担心这种方法的速度和准确性,所以如果有人知道正确的方法,仍然欢迎。否则,我会将其标记为完成。