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