/// <summary> /// Asynchronously read a DICOM file from stream. /// </summary> /// <param name="stream">Stream to read.</param> /// <param name="fallbackEncoding">Encoding to use if encoding cannot be obtained from DICOM file.</param> /// <param name="stop">Stop criterion in dataset.</param> /// <param name="readOption">The option how to deal with large DICOM tags like pixel data.</param> /// <param name="largeObjectSize">Custom limit of what are large values and what are not. If 0 is passend, then the default of 64k is used.</param> /// <returns>Awaitable <see cref="DicomFile"/> instance.</returns> public static async Task <DicomFile> OpenAsync(Stream stream, Encoding fallbackEncoding, Func <ParseState, bool> stop = null, FileReadOption readOption = FileReadOption.Default, int largeObjectSize = 0) { if (fallbackEncoding == null) { throw new ArgumentNullException(nameof(fallbackEncoding)); } var df = new DicomFile(); try { var source = StreamByteSourceFactory.Create(stream, readOption, largeObjectSize); using var unvalidated = new UnvalidatedScope(df.Dataset); var reader = new DicomFileReader(); var result = await reader.ReadAsync( source, new DicomDatasetReaderObserver(df.FileMetaInfo), new DicomDatasetReaderObserver(df.Dataset, fallbackEncoding), stop).ConfigureAwait(false); HandleOpenError(df, result); df.IsPartial = result == DicomReaderResult.Stopped || result == DicomReaderResult.Suspended; df.Format = reader.FileFormat; df.Dataset.InternalTransferSyntax = reader.Syntax; return(df); } catch (Exception e) { throw new DicomFileException(df, e.Message, e); } }
/// <summary> /// Asynchronously read DICOM Directory from stream. /// </summary> /// <param name="stream">Stream to read.</param> /// <param name="fallbackEncoding">Encoding to apply if it cannot be identified from DICOM directory.</param> /// <param name="stop">Stop criterion in dataset.</param> /// <returns>Awaitable <see cref="DicomDirectory"/> instance.</returns> public static new async Task <DicomDirectory> OpenAsync(Stream stream, Encoding fallbackEncoding, Func <ParseState, bool> stop = null) { if (fallbackEncoding == null) { throw new ArgumentNullException(nameof(fallbackEncoding)); } var df = new DicomDirectory(); try { var source = new StreamByteSource(stream); var reader = new DicomFileReader(); var dirObserver = new DicomDirectoryReaderObserver(df.Dataset); var result = await reader.ReadAsync( source, new DicomDatasetReaderObserver(df.FileMetaInfo), new DicomReaderMultiObserver( new DicomDatasetReaderObserver(df.Dataset, fallbackEncoding), dirObserver), stop).ConfigureAwait(false); return(FinalizeDicomDirectoryLoad(df, reader, dirObserver, result)); } catch (Exception e) { throw new DicomFileException(df, e.Message, e); } }
/// <summary> /// Asynchronously read DICOM Directory. /// </summary> /// <param name="fileName">File name.</param> /// <param name="fallbackEncoding">Encoding to apply if it cannot be identified from DICOM directory.</param> /// <param name="stop">Stop criterion in dataset.</param> /// <returns>Awaitable <see cref="DicomDirectory"/> instance.</returns> public static new async Task <DicomDirectory> OpenAsync(string fileName, Encoding fallbackEncoding, Func <ParseState, bool> stop = null) { if (fallbackEncoding == null) { throw new ArgumentNullException("fallbackEncoding"); } var df = new DicomDirectory(); // reset datasets df.FileMetaInfo.Clear(); df.Dataset.Clear(); try { df.File = IOManager.CreateFileReference(fileName); using (var source = new FileByteSource(df.File)) { var reader = new DicomFileReader(); var datasetObserver = new DicomDatasetReaderObserver(df.Dataset, fallbackEncoding); var dirObserver = new DicomDirectoryReaderObserver(df.Dataset); var result = await reader.ReadAsync( source, new DicomDatasetReaderObserver(df.FileMetaInfo), new DicomReaderMultiObserver(datasetObserver, dirObserver), stop).ConfigureAwait(false); if (result == DicomReaderResult.Processing) { throw new DicomFileException(df, "Invalid read return state: {state}", result); } if (result == DicomReaderResult.Error) { return(null); } df.IsPartial = result == DicomReaderResult.Stopped || result == DicomReaderResult.Suspended; df.Format = reader.FileFormat; df.Dataset.InternalTransferSyntax = reader.Syntax; df._directoryRecordSequence = df.Dataset.Get <DicomSequence>(DicomTag.DirectoryRecordSequence); df.RootDirectoryRecord = dirObserver.BuildDirectoryRecords(); return(df); } } catch (Exception e) { throw new DicomFileException(df, e.Message, e); } }
/// <summary> /// Asynchronously reads the specified filename and returns a DicomFile object. Note that the values for large /// DICOM elements (e.g. PixelData) are read in "on demand" to conserve memory. Large DICOM elements /// are determined by their size in bytes - see the default value for this in the FileByteSource._largeObjectSize /// </summary> /// <param name="fileName">The filename of the DICOM file</param> /// <param name="fallbackEncoding">Encoding to apply when attribute Specific Character Set is not available.</param> /// <param name="stop">Stop criterion in dataset.</param> /// <returns>Awaitable <see cref="DicomFile"/> instance.</returns> public static async Task <DicomFile> OpenAsync(string fileName, Encoding fallbackEncoding, Func <ParseState, bool> stop = null, FileReadOption readOption = FileReadOption.Default) { if (fallbackEncoding == null) { throw new ArgumentNullException(nameof(fallbackEncoding)); } var df = new DicomFile(); try { df.File = IOManager.CreateFileReference(fileName); using (var unvalidated = new UnvalidatedScope(df.Dataset)) using (var source = new FileByteSource(df.File, readOption)) { var reader = new DicomFileReader(); var result = await reader.ReadAsync( source, new DicomDatasetReaderObserver(df.FileMetaInfo), new DicomDatasetReaderObserver(df.Dataset, fallbackEncoding), stop).ConfigureAwait(false); if (result == DicomReaderResult.Processing) { throw new DicomFileException(df, $"Invalid read return state: {result}"); } if (result == DicomReaderResult.Error) { return(null); } df.IsPartial = result == DicomReaderResult.Stopped || result == DicomReaderResult.Suspended; df.Format = reader.FileFormat; df.Dataset.InternalTransferSyntax = reader.Syntax; return(df); } } catch (Exception e) { throw new DicomFileException(df, e.Message, e); } }
public async Task ReadAsync_CompressedImage_RecognizeTransferSyntax() { using var stream = File.OpenRead(TestData.Resolve("CT1_J2KI")); var source = new StreamByteSource(stream); var reader = new DicomFileReader(); var fileMetaInfo = new DicomFileMetaInformation(); var dataset = new DicomDataset(); await reader.ReadAsync( source, new DicomDatasetReaderObserver(fileMetaInfo), new DicomDatasetReaderObserver(dataset)); var expected = DicomTransferSyntax.JPEG2000Lossy; var actual = reader.Syntax; Assert.Equal(expected, actual); }
/// <summary> /// Asynchronously read a DICOM file from stream. /// </summary> /// <param name="stream">Stream to read.</param> /// <param name="fallbackEncoding">Encoding to use if encoding cannot be obtained from DICOM file.</param> /// <param name="stop">Stop criterion in dataset.</param> /// <returns>Awaitable <see cref="DicomFile"/> instance.</returns> public static async Task <DicomFile> OpenAsync(Stream stream, Encoding fallbackEncoding, Func <ParseState, bool> stop = null) { if (fallbackEncoding == null) { throw new ArgumentNullException("fallbackEncoding"); } var df = new DicomFile(); try { var source = new StreamByteSource(stream); var reader = new DicomFileReader(); var result = await reader.ReadAsync( source, new DicomDatasetReaderObserver(df.FileMetaInfo), new DicomDatasetReaderObserver(df.Dataset, fallbackEncoding), stop).ConfigureAwait(false); if (result == DicomReaderResult.Processing) { throw new DicomFileException(df, "Invalid read return state: {state}", result); } if (result == DicomReaderResult.Error) { return(null); } df.IsPartial = result == DicomReaderResult.Stopped || result == DicomReaderResult.Suspended; df.Format = reader.FileFormat; df.Dataset.InternalTransferSyntax = reader.Syntax; return(df); } catch (Exception e) { throw new DicomFileException(df, e.Message, e); } }