Partager via


Utiliser les API des standards DICOMweb en C#

Cet article montre comment utiliser le service DICOMweb en C# avec des exemples de fichiers .dcm DICOM®.

Utilisez les exemples de fichiers suivants :

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

Les noms de fichier, studyUID, seriesUID et instanceUID des exemples de fichiers DICOM sont les suivants :

Fichier 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

Remarque

Chacun de ces fichiers représente une seule instance et fait partie de la même étude. De plus, green-square et red-triangle font partie de la même série, alors que blue-circle fait partie d’une série distincte.

Prérequis

Pour utiliser les API des standards DICOMweb, vous avez besoin qu’une instance du service DICOM soit déployée. Pour plus d’informations, consultez Déployer le service DICOM à l’aide du portail Azure.

Une fois que vous avez déployé une instance du service DICOM, récupérez l’URL de votre App Service :

  1. Connectez-vous au portail Azure.
  2. Recherchez les Ressources récentes et sélectionnez votre instance de service DICOM.
  3. Copiez l’URL de service de votre service DICOM. Veillez à spécifier la version dans l’URL quand vous effectuez des requêtes. Pour plus d’informations, consultez Contrôle de version d’API pour le service DICOM.

Dans votre application, installez les packages NuGet suivants :

Créer un DicomWebClient

Une fois que vous avez déployé votre service DICOM, vous créez un DicomWebClient. Exécutez l’extrait de code pour créer le DicomWebClient, que vous utiliserez ensuite pour le reste de ce tutoriel. Vérifiez que les deux packages NuGet sont installés. Pour plus d’informations, consultez Obtenir un jeton d’accès pour le service DICOM à l’aide d’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}”); 

Avec DicomWebClient, nous pouvons désormais effectuer les opérations de stockage, de récupération, de recherche et de suppression.

Stocker des instances DICOM (STOW)

À l’aide de DicomWebClient, nous pouvons désormais stocker des fichiers DICOM.

Stocker une seule Instance

Le stockage d’une seule instance montre comment charger un seul fichier DICOM.

Détails :

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

Stocker des instances pour une étude spécifique

Le stockage d’instances pour une étude spécifique permet de montrer comment charger un fichier DICOM dans une étude spécifique.

Détails :

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

Avant de passer à la partie suivante du tutoriel, chargez le fichier green-square.dcm à l’aide de l’une des méthodes précédentes.

Récupérer une instance DICOM (WADO)

Les extraits de code montrent comment effectuer chacune des requêtes de récupération à l’aide du DicomWebClient créé.

Les variables sont utilisées dans le reste des exemples.

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

Récupérer toutes les instances dans une étude

Détails :

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

Les trois fichiers dcm que vous avez chargés font partie de la même étude. La réponse doit donc retourner les trois instances. Vérifiez que la réponse a le code d’état OK, et que les trois instances sont retournées.

Utiliser les instances récupérées

L’extrait de code suivant montre comment accéder aux instances récupérées. Il montre également comment accéder à certains champs des instances, et comment les enregistrer en tant que fichiers dcm.

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

Récupérer les métadonnées de toutes les instances dans une étude

Cette réponse récupère les métadonnées de toutes les instances au sein d’une seule étude.

Détails :

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

Les trois fichiers dcm que nous avons chargés font partie de la même étude. La réponse doit donc retourner les métadonnées des trois instances. Vérifiez que la réponse a le code d’état OK, et que toutes les métadonnées sont retournées.

Récupérer toutes les instances dans une série

Cette réponse récupère toutes les instances dans une seule série.

Détails :

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

Cette série a deux instances (green-square et red-triangle). La réponse doit donc retourner les deux instances. Vérifiez que la réponse a le code d’état OK, et que les deux instances sont retournées.

Récupérer les métadonnées de toutes les instances dans une série

Cette réponse récupère les métadonnées de toutes les instances au sein d’une seule étude.

Détails :

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

La série a deux instances (green-square et red-triangle). La réponse doit donc retourner les métadonnées des deux instances. Vérifiez que la réponse a le code d’état OK, et que les deux instances des métadonnées sont retournées.

Récupérer une seule instance au sein d’une série d’une étude

Cette requête récupère une instance unique.

Détails :

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

La réponse doit retourner uniquement l’instance de red-triangle. Vérifiez que la réponse a le code d’état OK, et que l’instance est retournée.

Récupérer les métadonnées d’une seule instance dans une série d’études

Cette requête récupère les métadonnées d’une seule instance au sein d’une seule étude et d’une seule série.

Détails :

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

La réponse doit retourner uniquement les métadonnées de l’instance de red-triangle. Vérifiez que la réponse a le code d’état OK, et que les métadonnées sont retournées.

Récupérer une ou plusieurs images à partir d’une seule instance

Cette requête récupère une ou plusieurs images à partir d’une seule instance.

Détails :

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

La réponse doit retourner la seule image de red-triangle. Vérifiez que la réponse a le code d’état OK, et que l’image est retournée.

Interroger DICOM (QIDO)

Remarque

Consultez la Déclaration de conformité de DICOM pour connaître les attributs DICOM pris en charge.

Rechercher des études

Cette requête recherche une ou plusieurs études en fonction d’attributs DICOM.

Détails :

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

Vérifiez que la réponse inclut une étude et que le code de réponse est OK.

Rechercher des séries

Cette requête recherche une ou plusieurs séries par attributs DICOM.

Détails :

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

Vérifiez que la réponse inclut une série et que le code de réponse est OK.

Rechercher des séries dans une étude

Cette requête recherche une ou plusieurs séries au sein d’une seule étude en fonction d’attributs DICOM.

Détails :

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

Vérifiez que la réponse inclut une série et que le code de réponse est OK.

Rechercher des instances

Cette requête recherche une ou plusieurs instances en fonction d’attributs DICOM.

Détails :

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

Vérifiez que la réponse inclut une instance et que le code de réponse est OK.

Rechercher des instances dans une étude

Cette requête recherche une ou plusieurs instances au sein d’une seule étude en fonction d’attributs DICOM.

Détails :

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

Vérifiez que la réponse inclut une instance et que le code de réponse est OK.

Rechercher des instances au sein d’une étude et d’une série

Cette requête recherche une ou plusieurs instances au sein d’une seule étude et d’une seule série en fonction d’attributs DICOM.

Détails :

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

Vérifiez que la réponse inclut une instance et que le code de réponse est OK.

Supprimer DICOM

Remarque

La suppression ne fait pas partie du standard DICOM, mais elle a été ajoutée pour des raisons pratiques.

Supprimer une instance spécifique au sein d’une étude et d’une série

Cette requête supprime une seule instance dans une seule étude et une seule série.

Détails :

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

Cette réponse supprime l’instance de red-triangle du serveur. Si l’opération réussit, le code d’état de la réponse ne contient aucun contenu.

Supprimer une série spécifique dans une étude

Cette requête supprime une seule série (et toutes les instances enfants) dans une seule étude.

Détails :

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

La réponse supprime l’instance du carré vert du serveur (c’est le seul élément restant dans la série). Si l’opération réussit, le code d’état de la réponse ne contient aucun contenu.

Supprimer une étude spécifique

Cette demande supprime une seule étude (et toutes les séries et instances enfants).

Détails :

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

La réponse supprime l’instance du cercle bleu du serveur (c’est le seul élément restant dans la série). Si l’opération réussit, le code d’état de la réponse ne contient aucun contenu.

Remarque

DICOM® est une marque déposée de la National Electrical Manufacturers Association pour ses publications de standards relatifs aux communications numériques des informations médicales.