Usando DICOMweb™ APIs padrão com C #

Importante

As APIs de serviços de saúde do Azure estão atualmente em VERSÃO PRÉVIA. Os Termos de Uso Complementares para Versões Prévias do Microsoft Azure incluem termos legais adicionais que se aplicam aos recursos do Azure que estão em versão beta, versão prévia ou que, de outra forma, ainda não foram lançados em disponibilidade geral.

Este tutorial usa C# para demonstrar o trabalho com o serviço DICOM.

Neste tutorial, usaremos os seguintes arquivos DICOM de exemplo. DCM.

  • Blue-Circle. DCM
  • dicom-metadata.csv
  • Green-Square. DCM
  • Red-Triangle. DCM

O nome do arquivo, studyUID, seriesUID e instanceUID dos arquivos DICOM de exemplo são os seguintes:

Arquivo 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

Observação

Cada um desses arquivos representa uma única instância e faz parte do mesmo estudo. Além disso, o quadrado verde e o triângulo vermelho fazem parte da mesma série, enquanto o círculo azul está em uma série separada.

Pré-requisitos

Para usar o DICOMweb™ APIs padrão, você deve ter uma instância do serviço DICOM implantada. Se você ainda não tiver implantado uma instância do serviço DICOM, consulte implantar o serviço DICOM usando o portal do Azure.

Depois de implantar uma instância do serviço DICOM, recupere a URL para o serviço de aplicativo:

  1. Entre no Portal do Azure.
  2. Pesquise recursos recentes e selecione sua instância de serviço DICOM.
  3. Copie a URL do serviço de seu serviço DICOM. Certifique-se de especificar a versão como parte da URL ao fazer solicitações. Mais informações podem ser encontradas no controle de versão da API para a documentação do serviço DICOM.

em seu aplicativo, instale os seguintes pacotes de NuGet:

Criar um DicomWebClient

Depois de implantar o serviço DICOM, você criará um DicomWebClient. Execute o seguinte trecho de código para criar DicomWebClient, que usaremos para o restante deste tutorial. verifique se você tem ambos os pacotes NuGet instalados, conforme mencionado anteriormente. Se você ainda não tiver obtido um token, consulte obter token de acesso para o serviço DICOM usando CLI do Azure.

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

Com o DicomWebClient, agora podemos executar as operações armazenar, recuperar, Pesquisar e excluir.

Armazenar instâncias DICOM (coloque)

Usando o DicomWebClient que criamos, agora podemos armazenar arquivos DICOM.

Armazenar instância única

Armazenar instância única demonstra como carregar um único arquivo DICOM.

Ver

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

Armazenar instâncias para um estudo específico

As instâncias de armazenamento de um estudo específico demonstram como carregar um arquivo DICOM em um estudo especificado.

Ver

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

Antes de passar para a próxima parte do tutorial, carregue o green-square.dcm arquivo usando um dos métodos anteriores.

Recuperando instância (s) DICOM (WADO)

Os trechos de código a seguir demonstram como executar cada uma das consultas de recuperação usando o DicomWebClient criado anteriormente.

As variáveis a seguir serão usadas em todo o restante dos exemplos:

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

Recuperar todas as instâncias em um estudo

A recuperação de todas as instâncias em um estudo recupera todas as instâncias em um único estudo.

Ver

  • OBTER/Studies/{Study}
DicomWebResponse response = await client.RetrieveStudyAsync(studyInstanceUid);

Todos os três arquivos do DCM que carregamos anteriormente fazem parte do mesmo estudo, portanto, a resposta deve retornar todas as três instâncias. Valide se a resposta tem um código de status OK e se todas as três instâncias são retornadas.

Usar as instâncias recuperadas

O trecho de código a seguir mostra como acessar as instâncias que são recuperadas. Ele também mostra como acessar alguns dos campos das instâncias e como salvá-los como um arquivo 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");
}

Recuperar metadados de todas as instâncias em estudo

Essa resposta recupera os metadados de todas as instâncias em um único estudo.

Ver

  • OBTER/Studies/{Study}/Metadata
DicomWebResponse response = await client.RetrieveStudyMetadataAsync(studyInstanceUid);

Todos os três arquivos do DCM que carregamos anteriormente fazem parte do mesmo estudo, portanto, a resposta deve retornar os metadados para todas as três instâncias. Valide se a resposta tem um código de status OK e se todos os metadados são retornados.

Recuperar todas as instâncias em uma série

Essa resposta recupera todas as instâncias em uma única série.

Ver

  • OBTER/Studies/{Study}/Series/{Series}
DicomWebResponse response = await client.RetrieveSeriesAsync(studyInstanceUid, seriesInstanceUid);

Esta série tem duas instâncias (verde-quadrado e vermelho-triângulo), portanto, a resposta deve retornar ambas as instâncias. Valide se a resposta tem um código de status OK e se ambas as instâncias são retornadas.

Recuperar metadados de todas as instâncias em uma série

Essa resposta recupera os metadados de todas as instâncias em um único estudo.

Ver

  • OBTER/Studies/{Study}/Series/{Series}/Metadata
DicomWebResponse response = await client.RetrieveSeriesMetadataAsync(studyInstanceUid, seriesInstanceUid);

Esta série tem duas instâncias (verde-quadrado e vermelho-triângulo), portanto, a resposta deve retornar metadados para ambas as instâncias. Valide se a resposta tem um código de status OK e se ambas as instâncias dos metadados são retornadas.

Recuperar uma única instância em uma série de um estudo

Essa solicitação recupera uma única instância.

Ver

  • OBTER/Studies/{Study}/Series{Series}/instances/{Instance}
DicomWebResponse response = await client.RetrieveInstanceAsync(studyInstanceUid, seriesInstanceUid, sopInstanceUid);

Essa resposta deve retornar apenas a instância Red-triângulo. Valide se a resposta tem um código de status OK e se a instância é retornada.

Recuperar metadados de uma única instância em uma série de um estudo

Essa solicitação recupera os metadados de uma única instância em um único estudo e série.

Ver

  • OBTER/Studies/{Study}/Series/{Series}/instances/{Instance}/Metadata
DicomWebResponse response = await client.RetrieveInstanceMetadataAsync(studyInstanceUid, seriesInstanceUid, sopInstanceUid);

Essa resposta deve retornar apenas os metadados para a instância Red-triângulo. Valide se a resposta tem um código de status OK e se os metadados são retornados.

Recuperar um ou mais quadros de uma única instância

Essa solicitação recupera um ou mais quadros de uma única instância.

Ver

  • OBTER/Studies/{Study}/Series/{Series}/instances/{Instance}/frames/{frames}
DicomWebResponse response = await client.RetrieveFramesAsync(studyInstanceUid, seriesInstanceUid, sopInstanceUid, frames: new[] { 1 });

Essa resposta deve retornar o único quadro do triângulo vermelho. Valide se a resposta tem um código de status OK e se o quadro é retornado.

Consulta DICOM (QIDO)

Observação

Consulte a declaração de conformidade de DICOM para obter os atributos de DICOM com suporte.

Pesquisar estudos

Essa solicitação procura um ou mais estudos por atributos DICOM.

Ver

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

Valida se a resposta inclui um estudo e se o código de resposta está OK.

Pesquisar por série

Essa solicitação procura uma ou mais séries por atributos DICOM.

Ver

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

Valida que a resposta inclui uma série e que o código de resposta está OK.

Pesquisar séries em um estudo

Essa solicitação procura uma ou mais séries em um único estudo por atributos DICOM.

Ver

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

Valida que a resposta inclui uma série e que o código de resposta está OK.

Pesquisar por instâncias

Essa solicitação procura uma ou mais instâncias por atributos DICOM.

Ver

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

Valida se a resposta inclui uma instância e se o código de resposta está OK.

Pesquisar instâncias em um estudo

Essa solicitação procura uma ou mais instâncias em um único estudo por atributos DICOM.

Ver

  • OBTER/Studies/{Study}/instances? SOPInstanceUID = {Instance}
string query = $"/studies/{studyInstanceUid}/instances?SOPInstanceUID={sopInstanceUid}";
DicomWebResponse response = await client.QueryAsync(query);

Valida se a resposta inclui uma instância e se o código de resposta está OK.

Pesquisar instâncias em um estudo e uma série

Essa solicitação procura uma ou mais instâncias em um único estudo e uma série única por atributos DICOM.

Ver

  • OBTER/Studies/{Study}/Series/{Series}instances? SOPInstanceUID = {Instance}
string query = $"/studies/{studyInstanceUid}/series/{seriesInstanceUid}/instances?SOPInstanceUID={sopInstanceUid}";
DicomWebResponse response = await client.QueryAsync(query);

Valida se a resposta inclui uma instância e se o código de resposta está OK.

Excluir DICOM

Observação

A exclusão não faz parte do padrão DICOM, mas foi adicionada para sua conveniência.

Excluir uma instância específica em um estudo e uma série

Essa solicitação exclui uma única instância em um único estudo e em uma única série.

Ver

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

Essa redação exclui a instância de triângulo vermelho do servidor. Se tiver êxito, o código de status de resposta não conterá nenhum conteúdo.

Excluir uma série específica em um estudo

Essa solicitação exclui uma única série (e todas as instâncias filho) em um único estudo.

Ver

  • EXCLUIR/Studies/{Study}/Series/{Series}
DicomWebResponse response = await client.DeleteSeriesAsync(studyInstanceUid, seriesInstanceUid);

Essa resposta exclui a instância do quadrado verde (é o único elemento à esquerda na série) do servidor. Se tiver êxito, o código de status de resposta não conterá nenhum conteúdo.

Excluir um estudo específico

Essa solicitação exclui um único estudo (e todas as séries e instâncias filho).

Ver

  • EXCLUIR/Studies/{Study}
DicomWebResponse response = await client.DeleteStudyAsync(studyInstanceUid);

Essa resposta exclui a instância de círculo azul (é o único elemento à esquerda na série) do servidor. Se tiver êxito, o código de status de resposta não conterá nenhum conteúdo.

Próximas etapas

Para obter informações sobre o serviço DICOM, consulte