fo-dicom - Как я могу загрузить изображения DCM из PACS и сохранить их?

Я пытаюсь загрузить образ DCM с сервера PACS, но при этом создается пустой файл 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");
}

Мой код

2 ответа

Ну, слово "скачать" здесь немного странно. Правильное слово Query-Retrieve.

Это двухэтапная операция, первая часть - Query (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) отправите команду CMove в PACS (CMoveSCP) с названием AE CStoreSCP, где вы хотите получать экземпляры. Это означает, что либо вы должны также разработать свой собственный CStoreSCP, либо вы должны привлечь другого. CMoveSCP прочитает отправленный вами заголовок AE и сопоставит его со своими конфигурациями. Это означает, что ваш CStoreSCP должен быть предварительно настроен на PACS. Из конфигураций, он будет принимать IP-адрес и порт, где он будет устанавливать новую ассоциацию. Это называется переключением ролей. CMoveSCP теперь также работает как CStoreSCU. Выступая в роли CStoreSCU, PACS затем отправит экземпляры в ваш CStoreSCP. Таким образом, вы на самом деле получаете изображения / экземпляры.

Я не занимаюсь разработкой программного обеспечения (@AndersGustafsson является экспертом в этом инструменте. Думаю, он также участвует в проекте); но я уверен, что это должно быть просто, если посмотреть на усилия, которые вы уже приложили. Когда я был новичком в DICOM, у меня редко возникали проблемы с синтаксисом. Большую часть времени у меня были проблемы с понятием и терминологией. Я попытался объяснить это здесь как можно лучше. Надеюсь, это поможет вам.

Пошли артиллерию от Рони:
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

C-FIND не используется для получения всего файла DICOM, он используется для фильтрации, например, изображений, принадлежащих конкретному исследованию и серии. Если UID исследования и серии, указанные в CreateImageQuery вызов доступен с изображениями в PACS, PACS ответит ответами C-FIND, где набор данных содержит UID экземпляра SOP каждого идентифицированного изображения.

Затем вам нужно будет сделать C-GET или C-MOVE, чтобы получить фактическое изображение из PACS.

Для получения дополнительной информации о том, как использовать различные сетевые вызовы, см. Страницу README в хранилище fo-dicom Github или изучите тесты сетевых модулей в хранилище.

Другие вопросы по тегам