public void GetCodec_KnownTransferSyntax_ShouldReturnCodecObject(DicomTransferSyntax transferSyntax, string expected) { var codec = DicomTranscoder.GetCodec(transferSyntax); var actual = codec.Name; Assert.Equal(expected, actual); }
public static DicomFile ChangeTransferSyntax(this DicomFile file, DicomTransferSyntax syntax, DicomCodecParams parameters = null) { DicomTranscoder transcoder = new DicomTranscoder(file.FileMetaInfo.TransferSyntax, syntax); transcoder.OutputCodecParams = parameters; return(transcoder.Transcode(file)); }
public static DicomDataset ChangeTransferSyntax(this DicomDataset dataset, DicomTransferSyntax syntax, DicomCodecParams parameters = null) { DicomTranscoder transcoder = new DicomTranscoder(dataset.InternalTransferSyntax, syntax); transcoder.OutputCodecParams = parameters; return(transcoder.Transcode(dataset)); }
/// <summary> /// Create a copy of the specified DICOM dataset with requested transfer syntax. /// </summary> /// <param name="dataset">DICOM dataset to copy.</param> /// <param name="syntax">Requested transfer syntax for the created DICOM dataset.</param> /// <param name="parameters">Codec parameters.</param> /// <returns>DICOM dataset with modified transfer syntax.</returns> public static DicomDataset Clone( this DicomDataset dataset, DicomTransferSyntax syntax, DicomCodecParams parameters = null) { var transcoder = new DicomTranscoder(dataset.InternalTransferSyntax, syntax, null, parameters); return(transcoder.Transcode(dataset)); }
/// <summary> /// Create a copy of the specified DICOM file with requested transfer syntax. /// </summary> /// <param name="file">DICOM file to copy.</param> /// <param name="syntax">Requested transfer syntax for the created DICOM file.</param> /// <param name="parameters">Codec parameters.</param> /// <returns>DICOM file with modified transfer syntax.</returns> public static DicomFile Clone( this DicomFile file, DicomTransferSyntax syntax, DicomCodecParams parameters = null) { var transcoder = new DicomTranscoder(file.FileMetaInfo.TransferSyntax, syntax, null, parameters); return(transcoder.Transcode(file)); }
public static GrayscaleRenderOptions FromMinMax(DicomDataset dataset) { var bits = BitDepth.FromDataset(dataset); var options = new GrayscaleRenderOptions(bits); options.RescaleSlope = dataset.Get<double>(DicomTag.RescaleSlope, 1.0); options.RescaleIntercept = dataset.Get<double>(DicomTag.RescaleIntercept, 0.0); int padding = dataset.Get<int>(DicomTag.PixelPaddingValue, 0, Int32.MinValue); var transcoder = new DicomTranscoder(dataset.InternalTransferSyntax, DicomTransferSyntax.ExplicitVRLittleEndian); var pixels = transcoder.DecodePixelData(dataset, 0); var range = pixels.GetMinMax(padding); if (range.Minimum < bits.MinimumValue || range.Minimum == Double.MaxValue) range.Minimum = bits.MinimumValue; if (range.Maximum > bits.MaximumValue || range.Maximum == Double.MinValue) range.Maximum = bits.MaximumValue; options.WindowWidth = Math.Abs(range.Maximum - range.Minimum); options.WindowCenter = range.Minimum + (options.WindowWidth / 2.0); options.VOILUTFunction = dataset.Get<string>(DicomTag.VOILUTFunction, "LINEAR"); options.Monochrome1 = dataset.Get<PhotometricInterpretation>(DicomTag.PhotometricInterpretation) == PhotometricInterpretation.Monochrome1; return options; }
public static GrayscaleRenderOptions FromHistogram(DicomDataset dataset, int percent = 90) { var bits = BitDepth.FromDataset(dataset); var options = new GrayscaleRenderOptions(bits); options.RescaleSlope = dataset.Get<double>(DicomTag.RescaleSlope, 1.0); options.RescaleIntercept = dataset.Get<double>(DicomTag.RescaleIntercept, 0.0); var transcoder = new DicomTranscoder(dataset.InternalTransferSyntax, DicomTransferSyntax.ExplicitVRLittleEndian); var pixels = transcoder.DecodePixelData(dataset, 0); var histogram = pixels.GetHistogram(0); int padding = dataset.Get<int>(DicomTag.PixelPaddingValue, 0, Int32.MinValue); if (padding != Int32.MinValue) histogram.Clear(padding); histogram.ApplyWindow(percent); options.WindowWidth = histogram.WindowEnd - histogram.WindowStart; options.WindowCenter = histogram.WindowStart + (options.WindowWidth / 2.0); options.VOILUTFunction = dataset.Get<string>(DicomTag.VOILUTFunction, "LINEAR"); options.Monochrome1 = dataset.Get<PhotometricInterpretation>(DicomTag.PhotometricInterpretation) == PhotometricInterpretation.Monochrome1; return options; }
/// <summary> /// Loads the pixel data for specified frame and set the internal dataset /// /// </summary> /// <param name="dataset">dataset to load pixeldata from</param> /// <param name="frame">The frame number to create pixeldata for</param> private void Load(DicomDataset dataset, int frame) { Dataset = dataset; if (PixelData == null) { PixelData = DicomPixelData.Create(Dataset); PhotometricInterpretation = PixelData.PhotometricInterpretation; } if (Dataset.InternalTransferSyntax.IsEncapsulated) { // decompress single frame from source dataset DicomCodecParams cparams = null; if (Dataset.InternalTransferSyntax == DicomTransferSyntax.JPEGProcess1 || Dataset.InternalTransferSyntax == DicomTransferSyntax.JPEGProcess2_4) { cparams = new DicomJpegParams { ConvertColorspaceToRGB = true }; } var transcoder = new DicomTranscoder(Dataset.InternalTransferSyntax, DicomTransferSyntax.ExplicitVRLittleEndian); transcoder.InputCodecParams = cparams; transcoder.OutputCodecParams = cparams; var buffer = transcoder.DecodeFrame(Dataset, frame); // clone the dataset because modifying the pixel data modifies the dataset var clone = Dataset.Clone(); clone.InternalTransferSyntax = DicomTransferSyntax.ExplicitVRLittleEndian; var pixelData = DicomPixelData.Create(clone, true); pixelData.AddFrame(buffer); // temporary fix for JPEG compressed YBR images if ((Dataset.InternalTransferSyntax == DicomTransferSyntax.JPEGProcess1 || Dataset.InternalTransferSyntax == DicomTransferSyntax.JPEGProcess2_4) && pixelData.SamplesPerPixel == 3) pixelData.PhotometricInterpretation = PhotometricInterpretation.Rgb; // temporary fix for JPEG 2000 Lossy images if (pixelData.PhotometricInterpretation == PhotometricInterpretation.YbrIct || pixelData.PhotometricInterpretation == PhotometricInterpretation.YbrRct) pixelData.PhotometricInterpretation = PhotometricInterpretation.Rgb; _pixelData = PixelDataFactory.Create(pixelData, 0); } else { // pull uncompressed frame from source pixel data _pixelData = PixelDataFactory.Create(PixelData, frame); } _pixelData = _pixelData.Rescale(_scale); _overlays = DicomOverlayData.FromDataset(Dataset).Where(x => x.Type == DicomOverlayType.Graphics && x.Data != null).ToArray(); _currentFrame = frame; CreatePipeline(); }
/// <summary> /// Create grayscale render options based on pixel data histogram. /// </summary> /// <param name="dataset">DICOM dataset from which render options should be obtained.</param> /// <param name="percent">Percentage of histogram window to include.</param> /// <returns>Grayscale render options based on pixel data histogram.</returns> public static GrayscaleRenderOptions FromHistogram(DicomDataset dataset, int percent = 90) { var bits = BitDepth.FromDataset(dataset); var options = new GrayscaleRenderOptions(bits); options.RescaleSlope = dataset.Get<double>(DicomTag.RescaleSlope, 1.0); options.RescaleIntercept = dataset.Get<double>(DicomTag.RescaleIntercept, 0.0); var transcoder = new DicomTranscoder( dataset.InternalTransferSyntax, DicomTransferSyntax.ExplicitVRLittleEndian); var pixels = transcoder.DecodePixelData(dataset, 0); var histogram = pixels.GetHistogram(0); int padding = dataset.Get<int>(DicomTag.PixelPaddingValue, 0, Int32.MinValue); if (padding != Int32.MinValue) histogram.Clear(padding); histogram.ApplyWindow(percent); var min = histogram.WindowStart * options.RescaleSlope + options.RescaleIntercept; var max = histogram.WindowEnd * options.RescaleSlope + options.RescaleIntercept; options.WindowWidth = Math.Abs(max - min); options.WindowCenter = (max + min) / 2.0; options.VOILUTFunction = dataset.Get<string>(DicomTag.VOILUTFunction, "LINEAR"); options.ColorMap = GetColorMap(dataset); return options; }
/// <summary> /// Create grayscale render options based on identified minimum and maximum pixel values. /// </summary> /// <param name="dataset">DICOM dataset from which render options should be obtained.</param> /// <returns>Grayscale render options based on identified minimum and maximum pixel values.</returns> public static GrayscaleRenderOptions FromMinMax(DicomDataset dataset) { var bits = BitDepth.FromDataset(dataset); var options = new GrayscaleRenderOptions(bits); options.RescaleSlope = dataset.Get<double>(DicomTag.RescaleSlope, 1.0); options.RescaleIntercept = dataset.Get<double>(DicomTag.RescaleIntercept, 0.0); int padding = dataset.Get<int>(DicomTag.PixelPaddingValue, 0, Int32.MinValue); var transcoder = new DicomTranscoder( dataset.InternalTransferSyntax, DicomTransferSyntax.ExplicitVRLittleEndian); var pixels = transcoder.DecodePixelData(dataset, 0); var range = pixels.GetMinMax(padding); if (range.Minimum < bits.MinimumValue || range.Minimum == Double.MaxValue) range.Minimum = bits.MinimumValue; if (range.Maximum > bits.MaximumValue || range.Maximum == Double.MinValue) range.Maximum = bits.MaximumValue; var min = range.Minimum * options.RescaleSlope + options.RescaleIntercept; var max = range.Maximum * options.RescaleSlope + options.RescaleIntercept; options.WindowWidth = Math.Abs(max - min); options.WindowCenter = (max + min) / 2.0; options.VOILUTFunction = dataset.Get<string>(DicomTag.VOILUTFunction, "LINEAR"); options.ColorMap = GetColorMap(dataset); return options; }
public static DicomFile ChangeTransferSyntax(this DicomFile file, DicomTransferSyntax syntax, DicomCodecParams parameters = null) { DicomTranscoder transcoder = new DicomTranscoder(file.FileMetaInfo.TransferSyntax, syntax); transcoder.InputCodecParams = parameters; transcoder.OutputCodecParams = parameters; return transcoder.Transcode(file); }
public static DicomDataset ChangeTransferSyntax(this DicomDataset dataset, DicomTransferSyntax syntax, DicomCodecParams parameters = null) { DicomTranscoder transcoder = new DicomTranscoder(dataset.InternalTransferSyntax, syntax); transcoder.InputCodecParams = parameters; transcoder.OutputCodecParams = parameters; return transcoder.Transcode(dataset); }