1

我正在尝试从 PACS 服务器下载 dcm 图像,但这会生成一个空的 dcm 文件。

以下是代码:

public void VisoresPacsController(string ipAddress, string aeTitle, string accessId, int port)
{
    /*
    this.ipAddress = ipAddress;
    this.aeTitle = aeTitle;
    this.accessId = accessId;
    this.port = port;
    visores.Add(new VisorCommandLine("Radiant", ""));
    ///new DicomCStoreRequest.
    */
    DicomClient client = new DicomClient();
    var query = DicomCFindRequest.CreateImageQuery("1.2.250.1.31.2.723.19980722.113224.11597", "1.2.250.1.31.3.723.19980722.113224.11597");
    client.AddRequest(query);
    query.OnResponseReceived = onResponse;
    client.Send("70.38.12.40", 4242, false, "THS", "ORTHANC");
}

public void onResponse(DicomCFindRequest req, DicomCFindResponse res)
{
    DicomDataset dataset = res.Dataset;
    dataset.Add(DicomTag.SOPClassUID, "1.2.250.1.31.4.723.19980722.113224.11597");
    //dataset.Add(DicomTag.StudyInstanceUID, GenerateUid());
    //dataset.Add(DicomTag.SeriesInstanceUID, GenerateUid());
    //dataset.Add(DicomTag.SOPInstanceUID, GenerateUid());
    DicomFile dicomFile = new DicomFile(dataset);
    dicomFile.Save(@"C:\Users\Developer 13\Desktop\dicomfile.dcm");
}

我的代码

4

2 回答 2

3

那么“下载”这个词在这里有点奇怪。正确的词是查询-检索。

这是两步操作,第一部分是您已经在做的查询(CFind)。

您可以将此与数据库查询进行比较。假设您有一个包含文件路径和名称的表。你的程序不知道路径。因此,您在数据库上运行类似SELECT Name, Path FROM FilesTable. 数据库返回数据。这就是 CFind 发生的事情,这就是你得到的onResponse(DicomCFindRequest req, DicomCFindResponse res)。中的数据res是数据库返回的一条记录。这不是实际文件。.

现在下一部分是从您刚刚收到的路径下载此文件。所以,你做一些文件操作,比如File.Copy(srcPath, destPath)或者可能是 HTTP/FTP 下载。在 DICOM 中,这可以通过两种方式实现 - CGet 和 CMove。CMove 更受欢迎的原因有很多。

在我的示例中,如果您已经知道文件的路径和名称,则可以绕过数据库查询。同样,如果你事先知道标识符,你可以绕过 CFind,直接做 CMove。参考这篇文章。

这一段会有点复杂,并且在不同实现的工作流中可能会有一些变化。要进行 CMove,必须存在 CStoreSCP。您 (CMoveSCU) 将向 PACS (CMoveSCP) 发送 CMove 命令,AE 标题为 CStoreSCP,您希望在其中接收实例。这意味着要么你也应该开发你自己的 CStoreSCP,要么你应该参与其他一些。CMoveSCP 将读取您发送的 AE 标题并将其与其配置相匹配。这意味着您的 CStoreSCP 必须提前在 PACS 上进行配置。从配置中,它将获取将建立新关联的 IP 地址和端口。这称为角色切换。CMoveSCP 现在也可用作 CStoreSCU。作为 CStoreSCU,PACS 会将实例推送到您的 CStoreSCP。这样,您实际上可以获得图像/实例。

我不是 fo-dicom 开发人员(@AndersGustafsson 是该工具的专家。我猜他也在为该项目做出贡献);但我相信这一定很简单,看看你已经付出的努力。当我刚接触 DICOM 时,我很少遇到语法问题。大多数时候,我对概念和术语有疑问。我试图用我能做到的最好的方式在这里解释它。希望这对您有所帮助。

参考 Rony 的文章:http: //dicomiseasy.blogspot.in/2012/01/dicom-queryretrieve-part-i.html
http://dicomiseasy.blogspot.in/2012/02/c-move.html

编辑1:

我在@AndersGustafsson 在他的回答中发布的链接中找到了一些示例代码。

var cmove = new DicomCMoveRequest("DEST-AE", studyInstanceUid);
var client = new DicomClient();
client.AddRequest(cmove);
client.Send("127.0.0.1", 11112, false, "SCU-AE", "SCP-AE");             // Alt 1
await client.SendAsync("127.0.0.1", 11112, false, "SCU-AE", "SCP-AE");  // Alt 2
于 2017-06-02T06:19:47.953 回答
1

C-FIND 不用于获取整个 DICOM 文件,它用于过滤掉例如属于特定研究和系列的图像。如果调用中指定的研究和系列实例 UIDCreateImageQuery可用于 PACS 的图像,则 PACS 将使用 C-FIND 响应进行响应,其中数据集包含识别的每个图像的SOP 实例 UID

然后您需要进行 C-GET 或 C-MOVE 以从 PACS 获取实际图像。

有关如何使用各种网络调用的更多信息,请参阅fo-dicom Github 存储库的README页面,或检查存储库中的网络单元测试。

于 2017-06-02T05:42:43.747 回答