Použití rozhraní API C# a DICOMweb Standard
Tento článek ukazuje, jak pracovat se službou DICOMweb pomocí jazyka C# a ukázkovými soubory .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ě.
Požadavky
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:
- Přihlaste se k portálu Azure.
- Vyhledejte nedávné prostředky a vyberte instanci služby DICOM.
- 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);
Řada má dvě instance (zelený čtverec a červený trojúhelník), takže odpověď by měla vracet 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);
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);
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 });
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)
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.QueryStudyAsync(query);
Ověřte, ž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.QuerySeriesAsync(query);
Ověřte, ž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.QueryStudySeriesAsync(studyInstanceUid, query);
Ověřte, ž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.QueryInstancesAsync(query);
Ověřte, ž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.QueryStudyInstanceAsync(studyInstanceUid, query);
Ověřte, ž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.QueryStudySeriesInstanceAsync(studyInstanceUid, seriesInstanceUid, query);
Ověřte, ž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);
Tato odpověď odstraní instanci č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);
Odpověď odstraní ze serveru zelenou instanci čtverce (je to jediný prvek, který zbývá v řadě). 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);
Odpověď odstraní instanci modrého kruhu ze serveru (je to jediný prvek, který zbývá v řadě). 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.