/// <summary> /// Reads the image asynchronous. /// </summary> /// <param name="path">The location of the image on the file system.</param> /// <param name="ct">The cancellation token.</param> /// <returns> /// The ITK image. /// </returns> /// <exception cref="ArgumentNullException"> /// path /// or /// ct /// </exception> public async Task <Image> ReadImageAsync(string path, CancellationToken ct) { if (string.IsNullOrWhiteSpace(path)) { throw new ArgumentNullException(nameof(path)); } if (ct == null) { throw new ArgumentNullException(nameof(ct)); } return(await Task.Run( () => { // TODO: // - check if path is a directory // - check if path contains multiple files // - determine file format // read DICOM image series // https://simpleitk.readthedocs.io/en/master/Examples/DicomSeriesReader/Documentation.html using (ImageFileReader reader = new ImageFileReader()) { try { ct.Register(() => { reader.Abort(); }); ct.ThrowIfCancellationRequested(); reader.SetFileName(path); Image image = reader.Execute(); image = ApplyRescaleIntensityImageFilter(image); image = ApplyCastImageFilter(image); return image; } catch (OperationCanceledException e) { throw new AmiException("The reading of the ITK image has been cancelled.", e); } catch (Exception e) { throw new AmiException("The ITK image could not be read.", e); } } }, ct)); }