Bagikan melalui


Menggunakan API Standar C# dan DICOMweb

Artikel ini memperlihatkan cara bekerja dengan layanan DICOMweb menggunakan C# dan sampel .dcm file DICOM®.

Gunakan file sampel ini:

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

Nama file, studyUID, seriesUID, dan instanceUID dari sampel file DICOM adalah:

File 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

Catatan

Masing-masing file ini mewakili satu instans dan merupakan bagian dari studi yang sama. Selain itu, segitiga hijau-persegi dan merah adalah bagian dari seri yang sama, sementara lingkaran biru berada dalam seri terpisah.

Prasyarat

Untuk menggunakan DICOMweb Standard API, Anda memerlukan instans layanan DICOM yang disebarkan. Untuk informasi selengkapnya, lihat Menyebarkan layanan DICOM menggunakan portal Azure.

Setelah Anda menyebarkan instans layanan DICOM, ambil URL untuk layanan aplikasi Anda:

  1. Masuk ke portal Azure.
  2. Cari Sumber daya Terbaru dan pilih instans layanan DICOM Anda.
  3. Salin URL Layanan layanan DICOM Anda. Pastikan untuk menentukan versi sebagai bagian dari url saat membuat permintaan. Untuk informasi selengkapnya, lihat Penerapan versi API untuk layanan DICOM.

Di aplikasi Anda, instal paket NuGet berikut:

Membuat DicomWebClient

Setelah menyebarkan layanan DICOM, Anda membuat DicomWebClient. Jalankan cuplikan kode untuk membuat DicomWebClient, yang Anda gunakan untuk sisa tutorial ini. Pastikan Anda memiliki kedua paket NuGet yang terinstal. Untuk informasi selengkapnya, lihat Mendapatkan token akses untuk layanan DICOM menggunakan 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}”); 

Dengan DicomWebClient, kita sekarang dapat melakukan operasi Store, Retrieve, Search, dan Delete.

Menyimpan instans DICOM (STOW)

Dengan menggunakan DicomWebClient, kita sekarang dapat menyimpan file DICOM.

Menyimpan instans tunggal

Menyimpan satu instans menunjukkan cara mengunggah satu file DICOM.

Detail:

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

Menyimpan instans untuk studi tertentu

Menyimpan instans untuk studi tertentu menunjukkan cara mengunggah file DICOM ke dalam studi tertentu.

Detail:

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

Sebelum melanjutkan ke bagian tutorial berikutnya, unggah green-square.dcm file menggunakan salah satu metode sebelumnya.

Mengambil instans DICOM (WADO)

Cuplikan kode menunjukkan cara melakukan setiap kueri ambil menggunakan DicomWebClient yang dibuat sebelumnya.

Variabel digunakan di seluruh contoh lainnya.

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

Mengambil semua instans dalam studi

Detail:

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

Ketiga file dcm yang Anda unggah sebelumnya adalah bagian dari studi yang sama, sehingga respons harus mengembalikan ketiga instans. Validasi bahwa respons memiliki kode status OK dan ketiga instans dikembalikan.

Menggunakan instans yang diambil

Cuplikan kode berikut menunjukkan cara mengakses instans yang diambil. Ini juga menunjukkan cara mengakses beberapa bidang instans, dan cara menyimpannya sebagai file 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");
}

Mengambil metadata semua instans dalam studi

Respons ini mengambil metadata untuk semua instans dalam satu studi.

Detail:

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

Ketiga file dcm yang kami unggah sebelumnya adalah bagian dari studi yang sama, sehingga respons harus mengembalikan metadata untuk ketiga instans. Validasi bahwa respons memiliki kode status OK dan semua metadata dikembalikan.

Mengambil semua instans dalam seri

Respons ini mengambil semua instans dalam satu seri.

Detail:

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

Seri ini memiliki dua instans (segitiga hijau-persegi dan merah), sehingga respons harus mengembalikan kedua instans. Validasi bahwa respons memiliki kode status OK dan kedua instans dikembalikan.

Mengambil metadata semua instans dalam seri

Respons ini mengambil metadata untuk semua instans dalam satu studi.

Detail:

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

Seri ini memiliki dua instans (persegi hijau dan segitiga merah), sehingga respons harus mengembalikan metadata untuk kedua instans. Validasi bahwa respons memiliki kode status OK dan kedua instans metadata dikembalikan.

Mengambil satu instans dalam serangkaian studi

Permintaan ini mengambil satu instans.

Detail:

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

Respons hanya boleh mengembalikan instans segitiga merah. Validasi bahwa respons memiliki kode status OK dan instans dikembalikan.

Mengambil metadata dari satu instans dalam serangkaian studi

Permintaan ini mengambil metadata untuk satu instans dalam satu studi dan seri.

Detail:

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

Respons hanya boleh mengembalikan metadata untuk instans segitiga merah. Validasi bahwa respons memiliki kode status OK dan metadata dikembalikan.

Mengambil satu atau beberapa bingkai dari satu instans

Permintaan ini mengambil satu atau beberapa bingkai dari satu instans.

Detail:

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

Respons harus mengembalikan satu-satunya bingkai dari segitiga merah. Validasi bahwa respons memiliki kode status OK dan bingkai dikembalikan.

KUERI DICOM (QIDO)

Catatan

Lihat Pernyataan Kesuaian DICOM untuk atribut DICOM yang didukung.

Mencari studi

Permintaan ini mencari satu atau beberapa studi berdasarkan atribut DICOM.

Detail:

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

Validasi bahwa respons mencakup satu studi, dan bahwa kode respons OK.

Cari seri

Permintaan ini mencari satu atau beberapa seri menurut atribut DICOM.

Detail:

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

Validasi bahwa respons mencakup satu seri, dan bahwa kode respons OK.

Mencari seri dalam studi

Permintaan ini mencari satu atau beberapa seri dalam satu studi oleh atribut DICOM.

Detail:

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

Validasi bahwa respons mencakup satu seri, dan bahwa kode respons OK.

Mencari instans

Permintaan ini mencari satu atau beberapa instans berdasarkan atribut DICOM.

Detail:

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

Validasi bahwa respons mencakup satu instans, dan bahwa kode respons OK.

Mencari instans dalam studi

Permintaan ini mencari satu atau beberapa instans dalam satu studi oleh atribut DICOM.

Detail:

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

Validasi bahwa respons mencakup satu instans, dan bahwa kode respons OK.

Mencari instans dalam studi dan seri

Permintaan ini mencari satu atau beberapa instans dalam satu studi dan satu seri oleh atribut DICOM.

Detail:

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

Validasi bahwa respons mencakup satu instans, dan bahwa kode respons OK.

Hapus DICOM

Catatan

Penghapusan bukan bagian dari standar DICOM, tetapi telah ditambahkan untuk kenyamanan.

Menghapus instans tertentu dalam studi dan seri

Permintaan ini menghapus satu instans dalam satu studi dan satu seri.

Detail:

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

Respons ini menghapus instans segitiga merah dari server. Jika berhasil, kode status respons tidak berisi konten.

Menghapus seri tertentu dalam studi

Permintaan ini menghapus satu seri (dan semua instans anak) dalam satu studi.

Detail:

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

Respons menghapus instans persegi hijau dari server (ini adalah satu-satunya elemen yang tersisa dalam seri). Jika berhasil, kode status respons tidak berisi konten.

Menghapus studi tertentu

Permintaan ini menghapus satu studi (dan semua seri dan instans anak).

Detail:

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

Respons menghapus instans lingkaran biru dari server (ini adalah satu-satunya elemen yang tersisa dalam seri). Jika berhasil, kode status respons tidak berisi konten.

Catatan

DICOM® adalah merek dagang terdaftar dari Asosiasi Produsen Listrik Nasional untuk publikasi Standar yang berkaitan dengan komunikasi digital informasi medis.