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

Die Dateinamen „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 das grüne Quadrat und das rote Dreieck Teil derselben Datenreihe, während sich der blaue Kreis 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 wir jetzt DICOM-Dateien speichern.

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 (grün-quadratisches und rotes Dreieck), sodass die Antwort Metadaten für beide Instanzen wiedergeben 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 das rote Dreieck der Instanz wiedergeben. Überprüfen Sie, ob die Antwort über einen Statuscode von OK verfügt und dass die Instanz wiedergegeben wird.

Abrufen von Metadaten einer einzelnen Instanz innerhalb einer Reihe 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);

Diese Antwort sollte nur die Metadaten für das rote Dreieck der Instanz wiedergeben. Überprüfen Sie, ob die Antwort über einen Statuscode von OK verfügt und dass die Metadaten wiedergegeben 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 });

Diese Antwort sollte den einzigen Frame aus dem roten Dreieck wiedergeben. Überprüfen Sie, ob die Antwort über einen Statuscode von OK verfügt und dass der Frame wiedergegeben 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 nach einer oder mehreren Studien nach DICOM-Attributen.

Details:

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

Überprüft, ob die Antwort eine Studie enthält und dass der Antwortcode OK ist.

Suchen Sie nach Datenreihen

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

Details:

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

Überprüft, ob die Antwort eine Datenreihe enthält und dass der Antwortcode OK ist.

Suchen Sie nach Reihen innerhalb einer Studie

Diese Anforderung sucht nach einer oder mehreren Datenreihen innerhalb einer einzigen Studie nach DICOM-Attributen.

Details:

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

Überprüft, ob die Antwort eine Datenreihe enthält und dass der Antwortcode OK ist.

Suchen Sie nach Instanzen

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

Details:

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

Überprüft, ob die Antwort eine Instanz enthält und dass der Antwortcode OK ist.

Suchen nach Instanzen innerhalb einer Studie

Diese Anforderung sucht nach einer oder mehreren Instanzen innerhalb einer einzigen Studie durch DICOM-Attribute.

Details:

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

Überprüft, ob die Antwort eine Instanz enthält und dass der Antwortcode OK ist.

Suchen nach Instanzen innerhalb einer Studie und Serie

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

Details:

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

Überprüft, ob die Antwort eine Instanz enthält und dass der Antwortcode OK ist.

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);

Dadurch wird die Rotdreieckinstanz vom Server gelöscht. Wenn dies erfolgreich ist, enthält der Antwortstatuscode keinen Inhalt.

Löschen einer bestimmten Reihe innerhalb einer Studie

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

Details:

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

Diese Antwort löscht die grün-quadratische Instanz (es ist das einzige Element in der Datenreihe) vom Server. 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 Reihen und Instanzen).

Details:

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

Diese Antwort löscht die Blaukreisinstanz (es ist das einzige Element in der Datenreihe) vom Server. Wenn dies erfolgreich ist, enthält der Antwortstatuscode keinen Inhalt.

Hinweis

DICOM® ist das eingetragene Warenzeichen der National Electrical Manufacturers Association für ihre Veröffentlichungen von Normen zur digitalen Kommunikation medizinischer Informationen.