Použití rozhraní API C# a DICOMweb Standard

Tento článek ukazuje, jak pracovat se službou DICOMweb pomocí C# a ukázkových souborů .dcm DICOM®.

Použijte tyto ukázkové soubory:

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

Název souboru, studyUID, seriesUID a instanceUID ukázkových souborů DICOM jsou:

Soubor 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

Poznámka:

Každý z těchto souborů představuje jednu instanci a je součástí stejné studie. Také zelený čtverec a červený trojúhelník jsou součástí stejné řady, zatímco modrý kruh je v samostatné řadě.

Předpoklady

Pokud chcete použít rozhraní API DICOMweb Standard, potřebujete nasazenou instanci služby DICOM. Další informace najdete v tématu Nasazení služby DICOM pomocí webu Azure Portal.

Po nasazení instance služby DICOM načtěte adresu URL vaší služby App Service:

  1. Přihlaste se k portálu Azure.
  2. Vyhledejte nedávné prostředky a vyberte instanci služby DICOM.
  3. Zkopírujte adresu URL služby služby DICOM. Při vytváření požadavků nezapomeňte zadat verzi jako součást adresy URL. Další informace najdete v tématu Správa verzí rozhraní API pro službu DICOM.

V aplikaci nainstalujte následující balíčky NuGet:

Vytvoření DicomWebClient

Po nasazení služby DICOM vytvoříte DicomWebClient. Spuštěním fragmentu kódu vytvořte DicomWebClient, který použijete pro zbytek tohoto kurzu. Ujistěte se, že máte nainstalované oba balíčky NuGet. Další informace najdete v tématu Získání přístupového tokenu pro službu DICOM pomocí 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}”); 

Pomocí DicomWebClient teď můžeme provádět operace Store, Retrieve, Search a Delete.

Ukládání instancí DICOM (STOW)

Pomocí dicomWebClient teď můžeme ukládat soubory DICOM.

Uložení jedné instance

Uložení jedné instance ukazuje, jak nahrát jeden soubor DICOM.

Podrobnosti:

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

Ukládání instancí pro konkrétní studii

Uložení instancí pro konkrétní studii ukazuje, jak nahrát soubor DICOM do zadané studie.

Podrobnosti:

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

Než přejdete k další části kurzu, nahrajte green-square.dcm soubor pomocí některé z předchozích metod.

Načtení instance DICOM (WADO)

Fragmenty kódu ukazují, jak provádět jednotlivé dotazy načítání pomocí dicomWebClient vytvořeného dříve.

Proměnné se používají ve zbývajících příkladech:

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

Načtení všech instancí ve studii

Podrobnosti:

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

Všechny tři soubory DCM, které jste nahráli dříve, jsou součástí stejné studie, takže odpověď by měla vrátit všechny tři instance. Ověřte, že odpověď obsahuje stavový kód OK a že se vrátí všechny tři instance.

Použití načtených instancí

Následující fragment kódu ukazuje, jak získat přístup k instancím, které jsou načteny. Ukazuje také, jak získat přístup k některým polím instancí a jak ho uložit jako soubor 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");
}

Načtení metadat všech instancí ve studii

Tato odpověď načte metadata pro všechny instance v rámci jedné studie.

Podrobnosti:

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

Všechny tři soubory DCM, které jsme nahráli dříve, jsou součástí stejné studie, takže odpověď by měla vrátit metadata pro všechny tři instance. Ověřte, že odpověď obsahuje stavový kód OK a že se vrátí všechna metadata.

Načtení všech instancí v rámci řady

Tato odpověď načte všechny instance v rámci jedné řady.

Podrobnosti:

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

Tato řada má dvě instance (zelený čtverec a červený trojúhelník), takže odpověď by měla vrátit obě instance. Ověřte, že odpověď obsahuje stavový kód OK a že se vrátí obě instance.

Načtení metadat všech instancí v rámci řady

Tato odpověď načte metadata pro všechny instance v rámci jedné studie.

Podrobnosti:

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

Tato řada má dvě instance (zelený čtverec a červený trojúhelník), takže odpověď by měla vrátit metadata pro obě instance. Ověřte, že odpověď má stavový kód OK a že se vrátí obě instance metadat.

Načtení jedné instance v rámci řady studie

Tento požadavek načte jednu instanci.

Podrobnosti:

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

Tato odpověď by měla vrátit pouze červený trojúhelník instance. Ověřte, že odpověď obsahuje stavový kód OK a že je vrácena instance.

Načtení metadat jedné instance v rámci řady studií

Tento požadavek načte metadata pro jednu instanci v rámci jedné studie a řady.

Podrobnosti:

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

Tato odpověď by měla vrátit pouze metadata pro instanci červený trojúhelník. Ověřte, že odpověď obsahuje stavový kód OK a že se vrátí metadata.

Načtení jednoho nebo více rámců z jedné instance

Tento požadavek načte jeden nebo více rámců z jedné instance.

Podrobnosti:

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

Tato odpověď by měla vrátit jediný rámec z červeného trojúhelníku. Ověřte, že odpověď obsahuje stavový kód OK a že se vrátí rámec.

Dotaz DICOM (QIDO)

Poznámka:

Informace o podporovanýchatributch

Hledání studií

Tento požadavek vyhledá jednu nebo více studií podle atributů DICOM.

Podrobnosti:

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

Ověří, že odpověď obsahuje jednu studii a že kód odpovědi je v pořádku.

Hledání řad

Tento požadavek vyhledá jednu nebo více řad podle atributů DICOM.

Podrobnosti:

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

Ověří, že odpověď obsahuje jednu řadu a že kód odpovědi je v pořádku.

Hledání řad v rámci studie

Tento požadavek vyhledá jednu nebo více řad v rámci jedné studie podle atributů DICOM.

Podrobnosti:

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

Ověří, že odpověď obsahuje jednu řadu a že kód odpovědi je v pořádku.

Hledání instancí

Tento požadavek vyhledá jednu nebo více instancí podle atributů DICOM.

Podrobnosti:

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

Ověří, že odpověď obsahuje jednu instanci a že kód odpovědi je v pořádku.

Hledání instancí ve studii

Tento požadavek vyhledá jednu nebo více instancí v rámci jedné studie podle atributů DICOM.

Podrobnosti:

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

Ověří, že odpověď obsahuje jednu instanci a že kód odpovědi je v pořádku.

Hledání instancí ve studii a řadě

Tento požadavek vyhledá jednu nebo více instancí v rámci jedné studie a jedné řady podle atributů DICOM.

Podrobnosti:

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

Ověří, že odpověď obsahuje jednu instanci a že kód odpovědi je v pořádku.

Odstranění DICOM

Poznámka:

Odstranění není součástí standardu DICOM, ale bylo přidáno pro usnadnění.

Odstranění konkrétní instance v rámci studie a řady

Tento požadavek odstraní jednu instanci v rámci jedné studie a jedné řady.

Podrobnosti:

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

Tím se odstraní instance červeného trojúhelníku ze serveru. Pokud je úspěšný, stavový kód odpovědi neobsahuje žádný obsah.

Odstranění konkrétní řady v rámci studie

Tento požadavek odstraní jednu řadu (a všechny podřízené instance) v rámci jedné studie.

Podrobnosti:

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

Tato odpověď odstraní ze serveru instanci zeleného čtverce (je to jediný prvek z řady). Pokud je úspěšný, stavový kód odpovědi neobsahuje žádný obsah.

Odstranění konkrétní studie

Tento požadavek odstraní jednu studii (a všechny podřízené řady a instance).

Podrobnosti:

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

Tato odpověď odstraní instanci modrého kruhu (je to jediný prvek, který zbývá v řadě) ze serveru. Pokud je úspěšný, stavový kód odpovědi neobsahuje žádný obsah.

Poznámka:

DICOM® je registrovaná ochranná známka asociace National Electrical Manufacturers Association pro publikace standardů týkající se digitální komunikace s lékařskými informacemi.