从存储为 DICOM 文件的放射治疗计划中提取信息后,我的问题现在是另一个问题。
我知道,我可以添加或更新现有计划中的项目(例如)
file.Dataset.AddOrUpdate(Dicom.DicomTag.PatientAge,23);
Run Code Online (Sandbox Code Playgroud)
即使按顺序处理 DicomTags 也不是问题(例如)
file.Dataset.Get<Dicom.DicomSequence>(Dicom.DicomTag.BeamSequence).Items[1].
Get<Dicom.DicomSequence>(Dicom.DicomTag.ControlPointSequence).Items[0].
Get<Dicom.DicomSequence>(Dicom.DicomTag.BeamLimitingDevicePositionSequence).Items[2].
AddOrUpdate(Dicom.DicomTag.LeafJawPositions, "-30\\30");
Run Code Online (Sandbox Code Playgroud)
但现在我想知道是否有可能创建一个完整的新序列并在其中存储信息?我知道想要这迫使我不仅创建一个项目,而且围绕这个项目创建更多信息,因为在我查看的计划中没有包含这个的序列。
在fo-dicom API 文档中,我找到了Dicom.IO.Writer命名空间。我看了一遍,但没有找到我期望找到的。按照我的第一直觉,我会写这个
string filename = "output.dcm";
DicomWriter file = new DicomWriter(@filename);
... trying to create TagElements
Run Code Online (Sandbox Code Playgroud)
另一个命令行DicomFileWriter file = new DicomFileWriter(...);也不起作用,因为构造函数只想接收选项。另一个DicomWriter()构造函数与此类似。
我还检查了file.Dataset编写新标签的可能性,但没有成功。所以我希望你们中的一个人可以给我一个提示,我做错了一步。
对于某些测试,我试图操纵PixelData以dicom格式存储的CT图像元素,然后使用C#中的Fellow Oak Dicom将其写回到文件中。经过一番研究,我发现,我要处理的基体是在Buffer的PixelData存储在byte-array。所以我写了下面的代码:
DicomFile ctFile = DicomFile.Open(image);
var pixDat = ctFile.Dataset.Get<byte[]>(DicomTag.PixelData);
for (int i = 0; i < pixData.Length; i++)
{
pixDat[i] = Convert.ToByte(200);
}
ctFile.Dataset.AddOrUpdate<byte[]>(DicomTag.PixelData, pixDat);
ctFile.Save("new file folder");
Run Code Online (Sandbox Code Playgroud)
这是我的第一次尝试,并且Exception在AddOrUpdate命令处输入了一个,因为它无法将byte-array 转换为OB。读例如Pianykh关于DICOM的书,OB表示Other Byte String。但是到目前为止,我还无法将操纵的byte数组转换为OB。当我尝试以下代码片段时:
DicomOtherByte dob = new DicomOtherByte(DicomTag.PixelData, pixDat);
ctFile.Dataset.AddOrUpdate<DicomOtherByte>(DicomTag.PixelData, dob);
Run Code Online (Sandbox Code Playgroud)
在Exception仍然在呼吁AddOrUpdate为是无法将项目转化为OB。在这里在stackoverflow上搜索,在git或google中的fo-dicom文档我仍然不知道如何处理它的线索。所以我想知道如何将操纵矩阵转换为OB,因为我认为DicomOtherByte是OB。
编辑:Exception是“无法创建类型为Dicom.DicomOtherByte类型的值的OB类型的DICOM元素”-System.InvalidOperationException
提前致谢。
我正在运行一个C#函数来创建一个以用户输入命名的数据库.我想防止SQL注入.通常,我会使用参数,但参数仅适用于数据操作而不适用于数据创建.代码是:
using (var conn = new MySqlConnection(connStr))
{
conn.Open();
var comm = conn.CreateCommand();
comm.CommandText = "CREATE DATABASE IF NOT EXISTS @name";
comm.Parameters.AddWithValue("@name", id);
comm.ExecuteNonQuery();
}
Run Code Online (Sandbox Code Playgroud)
由于参数不能用于创建数据库,因此对于防止注入进行消毒输入的最佳方法是什么?
谢谢!
对于我的项目,我试图在VS2015(.Net 4.5.2)中使用fo-dicom 3.0.2和C#从DICOM文件中读取放射治疗计划(RT Plan).
感谢DICOM编辑器,我知道存储在不同的值DicomTags,但我无法访问所有Tagseg我正在尝试阅读DicomTag.BeamDose,我知道值不是空的.
string storedfile = file_path + file_name;
Dicom.DicomFile file = Dicom.DicomFile.Open(@storedfile);
MessageBox.Show(file.Dataset.Get<string>(Dicom.DicomTag.BeamDose));
Run Code Online (Sandbox Code Playgroud)
运行代码会抛出一条带有消息的异常:
(300a,0084)在数据集中找不到.
如前所述,我知道它存在,但嵌套在序列中的序列项中.我尝试的下一件事是分析序列,BeamDose存储在哪里.
var NewDataSet = file.Dataset.Get<Dicom.DicomItem>(Dicom.DicomTag.FractionGroupSequence);
Run Code Online (Sandbox Code Playgroud)
但是,处理这个变量的每一次机会都没有让我进入下一级序列.
我应该如何使用fo-dicom从序列中读取嵌套/子DICOM标签?