Проблема с загрузкой изображений dicom в загрузчик WADO

Я работаю над веб-программой просмотра OHIF Dicom. Я использую чистый холст в качестве своего сервера PAC. Поэтому я разработал одно брокерское приложение в ядре .net, которое работает как WADO-RS и предоставляет информацию средству просмотра OHIF с чистого листа. В моем брокерском приложении я передаю метаданные средству просмотра OHIF в формате json с помощью конвертера FO-dicom json, который преобразует файл dcm в строку Json.

Мой код для отправки метаданных:

                              var files = Directory.GetFiles(directory);
                        List<JObject> lstjo = new List<JObject>();
                        JObject jo;
                        foreach (var file in files)
                        {
                            var dicomDirectory = DicomFile.Open(file, FileReadOption.ReadAll);
                            if (dicomDirectory.Dataset.InternalTransferSyntax.UID.UID != DicomTransferSyntax.ImplicitVRLittleEndian.UID.UID)
                            {
                                var transcoder = new DicomTranscoder(dicomDirectory.Dataset.InternalTransferSyntax, DicomTransferSyntax.ImplicitVRLittleEndian);
                                dicomDirectory = transcoder.Transcode(dicomDirectory);
                            }
                            JsonDicomConverter dicomConverter = new JsonDicomConverter();
                            StringBuilder sb = new StringBuilder();
                            StringWriter sw = new StringWriter(sb);
                            JsonWriter writer = new JsonTextWriter(sw);
                            Newtonsoft.Json.JsonSerializer serializer = new Newtonsoft.Json.JsonSerializer();
                            dicomConverter.WriteJson(writer, dicomDirectory.Dataset, serializer);
                            jo = JObject.Parse(sb.ToString());
                           // jo.Property("7FE00010").Remove();
                            retJsonstring += jo.ToString() + ",";
                        }
                        if (retJsonstring.Length > 6)
                        {
                            retJsonstring = retJsonstring.Substring(0, retJsonstring.Length - 1) + "]";
                        }
                        else
                        {
                            retJsonstring += "]";
                        }
                        retJsonstring = retJsonstring.Replace("\r", "").Replace("\n", "");
                    }
                    return retJsonstring;

Во время передачи метаданных в программе просмотра Ohif нет проблем. После этого программа просмотра OHIF отправляет запрос WADORS на отображение кадров. Мое брокерское приложение также отправляет ответ на этот запрос в составном виде.

Мой код для отправки многостраничного ответа:

                    {
                  var dicomFile = DicomFile.Open(path, FileReadOption.ReadAll);
                  string transfersyntax = dicomFile.Dataset.InternalTransferSyntax.UID.UID;
                  MemoryStream streamContent = new MemoryStream();
                  if (transfersyntax != DicomTransferSyntax.ImplicitVRLittleEndian.UID.UID)
                  {
                      var transcoder = new DicomTranscoder(dicomFile.Dataset.InternalTransferSyntax, DicomTransferSyntax.ImplicitVRLittleEndian);
                      dicomFile = transcoder.Transcode(dicomFile);                        
                  }
                  dicomFile.Save(streamContent);
                  DicomImage img = new DicomImage(dicomFile.Dataset, 0);
                  
                  streamContent.Seek(0, SeekOrigin.Begin);
                  string boundary = Guid.NewGuid().ToString();
                  MultipartContent multipartContent = new MultipartContent();

                  //newFile.Save(multipartContent.Stream);
                  multipartContent.Stream = streamContent;// File.OpenRead(path);
                  multipartContent.ContentType = "application/octet-stream";
                  multipartContent.transfersyntax = dicomFile.Dataset.InternalTransferSyntax.UID.UID;
                  multipartContent.FileName = "";
                  multiContentResult = new MultipartResult("related", boundary) { multipartContent };                    
                  return multiContentResult;                  
              }

Класс Mulitpart и класс MulticontentResult:

       public class MultipartContent
    {
        public string ContentType { get; set; }
        public string FileName { get; set; }
        public Stream Stream { get; set; }
        public string transfersyntax { get; set; }
    }

    public class MultipartResult : Collection<MultipartContent>, IActionResult
    {
        private readonly System.Net.Http.MultipartContent content;
        public MultipartResult(string subtype = "byteranges", string boundary = null)
        {
            if (boundary == null)
            {
                this.content = new System.Net.Http.MultipartContent(subtype);
            }
            else
            {
                this.content = new System.Net.Http.MultipartContent(subtype, boundary);
            }
        }

        public async Task ExecuteResultAsync(ActionContext context)
        {
            foreach (var item in this)
            {
                if (item.Stream != null)
                {
                    var content = new StreamContent(item.Stream);
                    if (item.ContentType != null)
                    {
                        content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue(item.ContentType);
                        content.Headers.ContentType.Parameters.Add(new System.Net.Http.Headers.NameValueHeaderValue("transfer-syntax", item.transfersyntax));
                    }
                    this.content.Add(content);
                }
            }
            context.HttpContext.Response.ContentLength = content.Headers.ContentLength;
            context.HttpContext.Response.ContentType = content.Headers.ContentType.ToString();
            await content.CopyToAsync(context.HttpContext.Response.Body);
        }
    }

После отправки ответа WAROrs я получаю сообщение об ошибке в средстве просмотра OHIF в RangeError: смещение выходит за пределы в stackviewport.js во время установки массива пиксельных данных flat32 в массив данных масштабирования flat32, как показано ниже.

Поэтому я проверяю в браузере после того, как узнаю, что размер данных Pixel и размер масштабируемых данных отличаются, как показано на изображении ниже. .

Чтобы проверить мой файл dcm, я проверил его с помощью программы просмотра ohif, напрямую открыв этот файл в https://v3-demo.ohif.org/local . Он нормально открывается.

Так каковы возможные причины этой проблемы? как исправить?

0 ответов

Другие вопросы по тегам