Teilen über


Verwenden von C#- und DICOMweb-Standard-APIs

In diesem Artikel wird gezeigt, wie Sie mit dem DICOMweb-Dienst mit C#- und Beispiel .dcm-DICOM-Dateien® arbeiten.

Verwenden Sie die folgenden Beispieldateien:

  • blue-circle.dcm
  • dicom-metadata.csv
  • green-square.dcm
  • red-triangle.dcm

Der Dateiname „studyUID“, „seriesUID“ und „instanceUID“ der DICOM-Beispieldateien sind:

Datei StudyUID SeriesUID InstanceUID
green-square.dcm 1.2.826.0.1.3680043.8.498.13230779778012324449356534479549187420 1.2.826.0.1.3680043.8.498.45787841905473114233124723359129632652 1.2.826.0.1.3680043.8.498.12714725698140337137334606354172323212
red-triangle.dcm 1.2.826.0.1.3680043.8.498.13230779778012324449356534479549187420 1.2.826.0.1.3680043.8.498.45787841905473114233124723359129632652 1.2.826.0.1.3680043.8.498.47359123102728459884412887463296905395
blue-circle.dcm 1.2.826.0.1.3680043.8.498.13230779778012324449356534479549187420 1.2.826.0.1.3680043.8.498.77033797676425927098669402985243398207 1.2.826.0.1.3680043.8.498.13273713909719068980354078852867170114

Hinweis

Jede dieser Dateien stellt eine einzelne Instanz dar und ist Teil derselben Studie. Außerdem sind green-square und red-triangle Teil derselben Datenreihe, während sich blue-circle in einer separaten Reihe befindet.

Voraussetzungen

Um die DICOMweb Standard-APIs zu verwenden, benötigen Sie eine Instanz des bereitgestellten DICOM-Diensts. Weitere Informationen finden Sie unter Bereitstellen des DICOM-Diensts mithilfe des Azure-Portals.

Rufen Sie nach der Bereitstellung einer Instanz des DICOM-Diensts die URL für Ihren App-Dienst ab:

  1. Melden Sie sich beim Azure-Portal an.
  2. Suchen Sie Zuletzt verwendete Ressourcen und wählen Sie Ihre DICOM-Dienstinstanz aus.
  3. Kopieren Sie die Dienst-URL Ihres DICOM-Diensts. Stellen Sie sicher, dass Sie die Version als Teil der URL angeben, wenn Sie Anforderungen stellen. Weitere Informationen finden Sie unter API-Versionsverwaltung für den DICOM-Dienst.

Installieren Sie in Ihrer Anwendung die folgenden NuGet-Pakete:

Erstellen eines DicomWebClient

Nachdem Sie Ihren DICOM-Dienst bereitgestellt haben, erstellen Sie einen DicomWebClient. Führen Sie den Codeausschnitt aus, um DicomWebClient zu erstellen, den Sie für den Rest dieses Lernprogramms verwenden. Stellen Sie sicher, dass beide NuGet-Pakete installiert sind. Weitere Informationen finden Sie unter Abrufen des Zugriffstokens für den DICOM-Dienst mit Azure CLI.

string webServerUrl ="{Your DicomWeb Server URL}"
var httpClient = new HttpClient();
httpClient.BaseAddress = new Uri(webServerUrl);
IDicomWebClient client = new DicomWebClient(httpClient);
client.HttpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", “{Your token value}”); 

Mit dem DicomWebClient können wir jetzt die Vorgänge „Speichern“, „Abrufen“, „Suchen“ und „Löschen“ ausführen.

DICOM-Instanzen speichern (STOW)

Mit dem DicomWebClient können jetzt DICOM-Dateien gespeichert werden.

Einzelne Instanz speichern

Die einzelne Store-Instanz veranschaulicht, wie eine einzelne DICOM-Datei hochgeladen wird.

Details:

  • POST/Studies
DicomFile dicomFile = await DicomFile.OpenAsync(@"{Path To blue-circle.dcm}");
DicomWebResponse response = await client.StoreAsync(new[] { dicomFile });

Speichern von Instanzen für eine bestimmte Studie

Speicherinstanzen für eine bestimmte Studie zeigen, wie Sie eine DICOM-Datei in eine bestimmte Studie hochladen können.

Details:

  • POST/studies/{study}
DicomFile dicomFile = await DicomFile.OpenAsync(@"{Path To red-triangle.dcm}");
DicomWebResponse response = await client.StoreAsync(new[] { dicomFile }, "1.2.826.0.1.3680043.8.498.13230779778012324449356534479549187420");

Bevor Sie mit dem nächsten Teil des Lernprogramms fortfahren, laden Sie die green-square.dcm-Datei mit einer der vorherigen Methoden hoch.

Abrufen einer DICOM-Instanz (WADO)

Die Codeschnipsel zeigen, wie Sie jede der abgerufenen Abfragen mithilfe des zuvor erstellten DicomWebClient ausführen.

Die Variablen werden während der restlichen Beispiele verwendet.

string studyInstanceUid = "1.2.826.0.1.3680043.8.498.13230779778012324449356534479549187420"; //StudyInstanceUID for all 3 examples
string seriesInstanceUid = "1.2.826.0.1.3680043.8.498.45787841905473114233124723359129632652"; //SeriesInstanceUID for green-square and red-triangle
string sopInstanceUid = "1.2.826.0.1.3680043.8.498.47359123102728459884412887463296905395"; //SOPInstanceUID for red-triangle

Abrufen aller Instanzen innerhalb einer Studie

Details:

  • GET/studies/{study}
DicomWebResponse response = await client.RetrieveStudyAsync(studyInstanceUid);

Alle drei dcm-Dateien, die Sie zuvor hochgeladen haben, gehören zu derselben Studie, daher sollte die Antwort alle drei Instanzen wiedergeben. Überprüfen Sie, ob die Antwort über einen Statuscode von OK verfügt und dass alle drei Instanzen wiedergegeben werden.

Verwenden Sie die abgerufenen Instanzen

Das folgende Codeschnipsel zeigt, wie Sie auf die abgerufenen Instanzen zugreifen. Außerdem wird gezeigt, wie Sie auf einige Felder der Instanzen zugreifen und wie sie als dcm-Datei gespeichert werden.

DicomWebAsyncEnumerableResponse<DicomFile> response = await client.RetrieveStudyAsync(studyInstanceUid);
await foreach (DicomFile file in response)
{
    string patientName = file.Dataset.GetString(DicomTag.PatientName);
    string studyId = file.Dataset.GetString(DicomTag.StudyID);
    string seriesNumber = file.Dataset.GetString(DicomTag.SeriesNumber);
    string instanceNumber = file.Dataset.GetString(DicomTag.InstanceNumber);

    file.Save($"<path_to_save>\\{patientName}{studyId}{seriesNumber}{instanceNumber}.dcm");
}

Abrufen von Metadaten aller Instanzen in der Studie

Diese Antwort ruft die Metadaten für alle Instanzen innerhalb einer einzigen Studie ab.

Details:

  • GET/studies/{study}/metadata
DicomWebResponse response = await client.RetrieveStudyMetadataAsync(studyInstanceUid);

Alle drei dcm-Dateien, die wir zuvor hochgeladen haben, sind Teil derselben Studie, sodass die Antwort die Metadaten für alle drei Instanzen wiedergeben sollte. Überprüfen Sie, ob die Antwort über einen Statuscode von OK verfügt und dass alle Metadaten wiedergegeben werden.

Abrufen aller Instanzen innerhalb einer Datenreihe

Diese Antwort ruft alle Instanzen innerhalb einer einzelnen Datenreihe ab.

Details:

  • GET/studies/{study}/series/{series}
DicomWebResponse response = await client.RetrieveSeriesAsync(studyInstanceUid, seriesInstanceUid);

Diese Datenreihe verfügt über zwei Instanzen (grün-quadratisches und rotes Dreieck), sodass die Antwort beide Instanzen wiedergeben sollte. Überprüfen Sie, ob die Antwort über einen Statuscode von OK verfügt und dass beide Instanzen wiedergegeben werden.

Abrufen von Metadaten aller Instanzen innerhalb einer Datenreihe

Diese Antwort ruft die Metadaten für alle Instanzen innerhalb einer einzigen Studie ab.

Details:

  • GET/studies/{study}/series/{series}/metadata
DicomWebResponse response = await client.RetrieveSeriesMetadataAsync(studyInstanceUid, seriesInstanceUid);

Diese Datenreihe verfügt über zwei Instanzen in Form eines grünen Vierecks und eines roten Dreiecks („green-square“ und „red-triangle“), sodass die Antwort Metadaten für beide Instanzen zurückgeben sollte. Überprüfen Sie, ob die Antwort über einen Statuscode von OK verfügt und dass beide Instanzen der Metadaten wiedergegeben werden.

Abrufen einer einzelnen Instanz innerhalb einer Reihe einer Studie

Diese Anforderung ruft eine einzelne Instanz ab.

Details:

  • GET/studies/{study}/series{series}/instances/{instance}
DicomWebResponse response = await client.RetrieveInstanceAsync(studyInstanceUid, seriesInstanceUid, sopInstanceUid);

Diese Antwort sollte nur die Instanz des roten Dreiecks (red-triangle) zurückgeben. Überprüfen Sie, ob die Antwort über den Statuscode „OK“ verfügt und die Instanz zurückgegeben wird.

Abrufen von Metadaten einer einzelnen Instanz innerhalb einer Datenreihe einer Studie

Diese Anforderung ruft die Metadaten für eine einzelne Instanz innerhalb einer einzigen Studie und Datenreihe ab.

Details:

  • GET/studies/{study}/series/{series}/instances/{instance}/metadata
DicomWebResponse response = await client.RetrieveInstanceMetadataAsync(studyInstanceUid, seriesInstanceUid, sopInstanceUid);

Dieses Codebeispiel sollte nur die Metadaten der Instanz des roten Dreiecks (red-triangle) zurückgeben. Überprüfen Sie, ob die Antwort über den Statuscode „OK“ verfügt und die Metadaten zurückgegeben werden.

Abrufen eines oder mehrerer Frames aus einer einzelnen Instanz

Diese Anforderung ruft einen oder mehrere Frames aus einer einzelnen Instanz ab.

Details:

  • GET/studies/{study}/series/{series}/instances/{instance}/frames/{frames}
DicomWebResponse response = await client.RetrieveFramesAsync(studyInstanceUid, seriesInstanceUid, sopInstanceUid, frames: new[] { 1 });

Die Antwort sollte den einzigen Frame aus dem roten Dreieck wiedergeben. Überprüfen Sie, ob die Antwort über den Statuscode von „OK“ verfügt und der Frame zurückgegeben wird.

Abfrage DICOM (QIDO)

Hinweis

Informationen zu unterstützten DICOM-Attributen finden Sie in der DICOM-Konformitätserklärung.

Suchen Sie nach Studien

Diese Anforderung sucht mithilfe von DICOM-Attributen nach einer oder mehreren Studien.

Details:

  • GET/studies?StudyInstanceUID={study}
string query = $"/studies?StudyInstanceUID={studyInstanceUid}";
DicomWebResponse response = await client.QueryStudyAsync(query);

Vergewissern Sie sich, dass die Antwort eine einzelne Studie enthält und dass der Antwortcode „OK“ lautet.

Suchen nach Datenreihen

Diese Anforderung sucht mithilfe von DICOM-Attributen nach einer oder mehreren Datenreihen.

Details:

  • GET/series?SeriesInstanceUID={series}
string query = $"/series?SeriesInstanceUID={seriesInstanceUid}";
DicomWebResponse response = await client.QuerySeriesAsync(query);

Vergewissern Sie sich, dass die Antwort eine einzelne Datenreihe enthält und dass der Antwortcode „OK“ lautet.

Suchen nach Datenreihen innerhalb einer Studie

Diese Anforderung sucht mithilfe von DICOM-Attributen nach einer oder mehreren Datenreihen innerhalb einer einzelnen Studie.

Details:

  • GET/studies/{study}/series?SeriesInstanceUID={series}
string query = $"/studies/{studyInstanceUid}/series?SeriesInstanceUID={seriesInstanceUid}";
DicomWebResponse response = await client.QueryStudySeriesAsync(studyInstanceUid, query);

Vergewissern Sie sich, dass die Antwort eine einzelne Datenreihe enthält und dass der Antwortcode „OK“ lautet.

Suchen nach Instanzen

Diese Anforderung sucht mithilfe von DICOM-Attributen nach einer oder mehreren Instanzen.

Details:

  • GET/instances?SOPInstanceUID={instance}
string query = $"/instances?SOPInstanceUID={sopInstanceUid}";
DicomWebResponse response = await client.QueryInstancesAsync(query);

Vergewissern Sie sich, dass die Antwort eine einzelne Instanz enthält und dass der Antwortcode „OK“ lautet.

Suchen nach Instanzen innerhalb einer Studie

Diese Anforderung sucht mithilfe von DICOM-Attributen nach einer oder mehreren Instanzen innerhalb einer einzelnen Studie.

Details:

  • GET/studies/{study}/instances?SOPInstanceUID={instance}
string query = $"/studies/{studyInstanceUid}/instances?SOPInstanceUID={sopInstanceUid}";
DicomWebResponse response = await client.QueryStudyInstanceAsync(studyInstanceUid, query);

Vergewissern Sie sich, dass die Antwort eine einzelne Instanz enthält und dass der Antwortcode „OK“ lautet.

Suchen nach Instanzen innerhalb einer Studie und Datenreihe

Diese Anforderung sucht mithilfe von DICOM-Attributen nach einer oder mehreren Instanzen innerhalb einer einzelnen Studie und einer einzelnen Datenreihe.

Details:

  • GET /studies/{study}/series/{series}/instances?SOPInstanceUID={instance}
string query = $"/studies/{studyInstanceUid}/series/{seriesInstanceUid}/instances?SOPInstanceUID={sopInstanceUid}";
DicomWebResponse response = await client.QueryStudySeriesInstanceAsync(studyInstanceUid, seriesInstanceUid, query);

Vergewissern Sie sich, dass die Antwort eine einzelne Instanz enthält und dass der Antwortcode „OK“ lautet.

Löschen von DICOM

Hinweis

„Löschen“ ist nicht Teil des DICOM-Standards, wurde jedoch zur Vereinfachung hinzugefügt.

Löschen einer bestimmten Instanz innerhalb einer Studie und Serie

Diese Anforderung löscht eine einzelne Instanz innerhalb einer einzelnen Studie und einer einzelnen Datenreihe.

Details:

  • DELETE/studies/{study}/series/{series}/instances/{instance}
string sopInstanceUidRed = "1.2.826.0.1.3680043.8.498.47359123102728459884412887463296905395";
DicomWebResponse response = await client.DeleteInstanceAsync(studyInstanceUid, seriesInstanceUid, sopInstanceUidRed);

Durch diese Antwort wird die Instanz des roten Dreiecks vom Server gelöscht. Wenn dies erfolgreich ist, enthält der Antwortstatuscode keinen Inhalt.

Löschen einer bestimmten Datenreihe innerhalb einer Studie

Diese Anforderung löscht eine einzelne Datenreihe (und alle untergeordneten Instanzen) innerhalb einer einzelnen Studie.

Details:

  • DELETE/studies/{study}/series/{series}
DicomWebResponse response = await client.DeleteSeriesAsync(studyInstanceUid, seriesInstanceUid);

Durch die Antwort wird die Instanz des grünen Vierecks (das einzige verbleibende Element in der Datenreihe) vom Server gelöscht. Wenn dies erfolgreich ist, enthält der Antwortstatuscode keinen Inhalt.

Löschen einer bestimmte Studie

Diese Anforderung löscht eine einzelne Studie (und alle untergeordneten Datenreihen und Instanzen).

Details:

  • DELETE/studies/{study}
DicomWebResponse response = await client.DeleteStudyAsync(studyInstanceUid);

Durch die Antwort wird die Instanz des blauen Kreises (das einzige verbleibende Element in der Datenreihe) vom Server gelöscht. Wenn dies erfolgreich ist, enthält der Antwortstatuscode keinen Inhalt.

Hinweis

DICOM® ist die eingetragene Marke des National Electrical Manufacturers Association für seine Standards-Publikationen über die digitale Kommunikation medizinischer Informationen.