Exemple #1
0
        private static void CreateSeries(DicomFile file, string seriesInstanceUid, List <DicomSeries> seriesList)
        {
            var sopclass = file.Dataset.GetValueOrDefault(DicomTag.SOPClassUID, 0, string.Empty);

            if (!IsSupportedSopClass(sopclass))
            {
                logger.LogError($"SOP class not supported: '{sopclass}' ");
                return;
            }

            var series = seriesList.FirstOrDefault(s => s.SeriesInstanceUid == seriesInstanceUid);

            if (series == null)
            {
                var seriesNumber = file.Dataset.GetValueOrDefault(DicomTag.SeriesNumber, 0, string.Empty);

                series = new DicomSeries
                {
                    SeriesInstanceUid = seriesInstanceUid,
                    SopClassUid       = sopclass,
                    Number            = seriesNumber
                };
                seriesList.Add(series);
            }
            series.FileNames.Add(file.File.Name);
            series.Files.Add(file);
        }
Exemple #2
0
 public static Scan Load(DicomSeries series)
 {
     try
     {
         if (series.FileNames.Count == 1)
         {
             var filePath = series.FileNames.First();
             var file     = DicomFile.Open(filePath);
             return(Load(file));
         }
         else if (series.FileNames.Count > 1)
         {
             var files = new List <DicomFile>();
             foreach (var fileName in series.FileNames)
             {
                 var file = DicomFile.Open(fileName);
                 files.Add(file);
             }
             return(Load(files));
         }
     }
     catch (Exception e)
     {
         logger.LogWarning(e, $"Could not load dataset '{e.Message}' {e.StackTrace}");
     }
     return(null);
 }
Exemple #3
0
 private static void GenerateThumbnail(DicomSeries series)
 {
     for (int i = series.FileNames.Count / 2; i >= 0; i--)
     {
         var middleFileName = series.FileNames[i];
         var middleFile     = DicomFile.Open(middleFileName);
         if (middleFile.Dataset.Contains(DicomTag.PixelData))
         {
             DicomImage image = new DicomImage(middleFile.Dataset);
             image.Scale = 0.25;
             var frame         = image.NumberOfFrames / 2;
             var renderedImage = image.RenderImage(frame);
             series.Thumbnail = renderedImage.AsWriteableBitmap();
             break;
         }
     }
 }
Exemple #4
0
        public static IEnumerable <Series> ExtractSeriesFromDicomDir(string path, bool generateMissingThumbnails)
        {
            var result = new List <DicomSeries>();

            if (!DicomFile.HasValidHeader(path))
            {
                return(result);
            }

            try
            {
                var dicomDirectory = DicomDirectory.Open(path);

                foreach (var patientRecord in dicomDirectory.RootDirectoryRecordCollection)
                {
                    foreach (var studyRecord in patientRecord.LowerLevelDirectoryRecordCollection)
                    {
                        foreach (var seriesRecord in studyRecord.LowerLevelDirectoryRecordCollection)
                        {
                            var seriesRecordType = seriesRecord.GetSingleValueOrDefault(DicomTag.DirectoryRecordType, string.Empty);
                            if (seriesRecordType != "SERIES")
                            {
                                continue;
                            }
                            var series = new DicomSeries
                            {
                                SeriesInstanceUid = seriesRecord.GetSingleValueOrDefault(DicomTag.SeriesInstanceUID, ""),
                                Number            = seriesRecord.GetSingleValueOrDefault(DicomTag.SeriesNumber, ""),
                            };

                            DicomSequence iconImageSequence;

                            if (seriesRecord.TryGetSequence(DicomTag.IconImageSequence, out iconImageSequence))
                            {
                                var iconImage = iconImageSequence.FirstOrDefault();
                                if (iconImage != null)
                                {
                                    DicomImage image = new DicomImage(iconImage);
                                    series.Thumbnail = image.RenderImage().AsWriteableBitmap();
                                }
                            }
                            foreach (var imageRecord in seriesRecord.LowerLevelDirectoryRecordCollection)
                            {
                                var imageRecordType = imageRecord.GetSingleValueOrDefault(DicomTag.DirectoryRecordType, string.Empty);
                                if (imageRecordType != "IMAGE")
                                {
                                    continue;
                                }

                                var values       = imageRecord.GetValues <string>(DicomTag.ReferencedFileID);
                                var relativePath = string.Join(@"\", values);

                                series.SopClassUid     = imageRecord.GetSingleValueOrDefault(DicomTag.ReferencedSOPClassUIDInFile, "");
                                series.NumberOfImages += Math.Max(1, imageRecord.GetSingleValueOrDefault(DicomTag.NumberOfFrames, 1));
                                var absolutePath = Path.GetDirectoryName(path) + @"\\" + relativePath;
                                series.FileNames.Add(absolutePath);
                            }

                            if (generateMissingThumbnails && series.Thumbnail == null && series.FileNames.Count > 0)
                            {
                                GenerateThumbnail(series);
                            }
                            if (series.NumberOfImages > 0)
                            {
                                result.Add(series);
                            }
                        }
                    }
                }
            }
            catch (Exception e)
            {
                logger.LogWarning(e, $"Could not read DICOMDIR file '{e.Message}' {e.StackTrace}");
            }
            return(result);
        }