/// <summary>
 /// Initialize new instance of EncapsulatedPixelData
 /// </summary>
 /// <param name="dataset">The source dataset to extract from or create new pixel data for</param>
 /// <param name="newPixelData">True to create new pixel data, false to read pixel data</param>
 public EncapsulatedPixelData(DicomDataset dataset, bool newPixelData) : base(dataset)
 {
     if (newPixelData)
     {
         NumberOfFrames = 0;
         Element        = new DicomOtherByteFragment(DicomTag.PixelData);
         Dataset.Add(Element);
     }
     else
     {
         Element = dataset.Get <DicomFragmentSequence>(DicomTag.PixelData);
     }
 }
        public void GivenADataSetWithDicomFragmentSequence_WhenRedact_ValueWillBeRedact()
        {
            var tag  = DicomTag.PixelData;
            var item = new DicomOtherByteFragment(tag);

            item.Fragments.Add(new MemoryByteBuffer(Convert.FromBase64String("fragment")));
            item.Fragments.Add(new MemoryByteBuffer(Convert.FromBase64String("fragment")));

            var dataset = new DicomDataset(item);

            Processor.Process(dataset, item);
            Assert.Equal(new byte[] { }, dataset.GetDicomItem <DicomElement>(tag).Get <byte[]>());
        }
Exemple #3
0
        private static void CreateAndAddPixelData(DicomDataset dataset, IByteBuffer pixelData)
        {
            var syntax = dataset.InternalTransferSyntax;

            if (syntax == DicomTransferSyntax.ImplicitVRLittleEndian)
            {
                var Element = new DicomOtherWord(DicomTag.PixelData, new CompositeByteBuffer());
                CompositeByteBuffer buffer = Element.Buffer as CompositeByteBuffer;
                buffer.Buffers.Add(pixelData);
                dataset.Add(Element);
                return;
            }
            if (syntax.IsEncapsulated)
            {
                var  Element = new DicomOtherByteFragment(DicomTag.PixelData);
                long pos     = Element.Fragments.Sum(x => (long)x.Size + 8);
                if (pos < uint.MaxValue)
                {
                    Element.OffsetTable.Add((uint)pos);
                }
                else
                {
                    // do not create an offset table for very large datasets
                    Element.OffsetTable.Clear();
                }

                pixelData = EndianByteBuffer.Create(pixelData, dataset.InternalTransferSyntax.Endian, dataset.Get <ushort>(DicomTag.BitsAllocated));
                Element.Fragments.Add(pixelData);
                dataset.Add(Element);
                return;
            }
            if (dataset.Get <ushort>(DicomTag.BitsAllocated) == 16)
            {
                var Element = new DicomOtherWord(DicomTag.PixelData, new CompositeByteBuffer());
                CompositeByteBuffer buffer = Element.Buffer as CompositeByteBuffer;
                buffer.Buffers.Add(pixelData);
                dataset.Add(Element);
            }
            else
            {
                var Element = new DicomOtherByte(DicomTag.PixelData, new CompositeByteBuffer());
                CompositeByteBuffer buffer = Element.Buffer as CompositeByteBuffer;
                buffer.Buffers.Add(pixelData);
                dataset.Add(Element);
            }
        }
Exemple #4
0
 /// <summary>
 /// Initialize new instance of EncapsulatedPixelData
 /// </summary>
 /// <param name="dataset">The source dataset to extract from or create new pixel data for</param>
 /// <param name="newPixelData">True to create new pixel data, false to read pixel data</param>
 public EncapsulatedPixelData(DicomDataset dataset, bool newPixelData)
     : base(dataset)
 {
     if (newPixelData)
     {
         NumberOfFrames = 0;
         Element = new DicomOtherByteFragment(DicomTag.PixelData);
         Dataset.Add(Element);
     }
     else Element = dataset.Get<DicomFragmentSequence>(DicomTag.PixelData);
 }
Exemple #5
0
            //DCMTK djcodecd.cxx
            public static int ScanJpegForBitDepth(DicomPixelData pixelData)
            {
                DicomOtherByteFragment element = pixelData.Dataset.Get <DicomOtherByteFragment>(DicomTag.PixelData);
                IByteBuffer            buffer  = element.Fragments[0];
                MemoryStream           ms      = new MemoryStream(buffer.Data);
                BinaryReader           br      = EndianBinaryReader.Create(ms, Endian.Big);

                long length = ms.Length;

                while (ms.Position < length)
                {
                    ushort marker = br.ReadUInt16();
                    switch (marker)
                    {
                    case 0xffc0:             // SOF_0: JPEG baseline
                    case 0xffc1:             // SOF_1: JPEG extended sequential DCT
                    case 0xffc2:             // SOF_2: JPEG progressive DCT
                    case 0xffc3:             // SOF_3: JPEG lossless sequential
                    case 0xffc5:             // SOF_5: differential (hierarchical) extended sequential, Huffman
                    case 0xffc6:             // SOF_6: differential (hierarchical) progressive, Huffman
                    case 0xffc7:             // SOF_7: differential (hierarchical) lossless, Huffman
                        ms.Seek(2, SeekOrigin.Current);
                        return((int)br.ReadByte());

                    case 0xffc8:             // Reserved for JPEG extentions
                        ms.Seek(br.ReadUInt16() - 2, SeekOrigin.Current);
                        break;

                    case 0xffc9:             // SOF_9: extended sequential, arithmetic
                    case 0xffca:             // SOF_10: progressive, arithmetic
                    case 0xffcb:             // SOF_11: lossless, arithmetic
                    case 0xffcd:             // SOF_13: differential (hierarchical) extended sequential, arithmetic
                    case 0xffce:             // SOF_14: differential (hierarchical) progressive, arithmetic
                    case 0xffcf:             // SOF_15: differential (hierarchical) lossless, arithmetic
                        ms.Seek(2, SeekOrigin.Current);
                        return((int)br.ReadByte());

                    case 0xffc4:             // DHT
                    case 0xffcc:             // DAC
                        ms.Seek(br.ReadUInt16() - 2, SeekOrigin.Current);
                        break;

                    case 0xffd0:             // RST m
                    case 0xffd1:
                    case 0xffd2:
                    case 0xffd3:
                    case 0xffd4:
                    case 0xffd5:
                    case 0xffd6:
                    case 0xffd7:
                    case 0xffd8:             // SOI
                    case 0xffd9:             // EOI
                        break;

                    case 0xffda:             // SOS
                    case 0xffdb:             // DQT
                    case 0xffdc:             // DNL
                    case 0xffdd:             // DRI
                    case 0xffde:             // DHP
                    case 0xffdf:             // EXP
                    case 0xffe0:             // APPn
                    case 0xffe1:
                    case 0xffe2:
                    case 0xffe3:
                    case 0xffe4:
                    case 0xffe5:
                    case 0xffe6:
                    case 0xffe7:
                    case 0xffe8:
                    case 0xffe9:
                    case 0xffea:
                    case 0xffeb:
                    case 0xffec:
                    case 0xffed:
                    case 0xffee:
                    case 0xffef:
                    case 0xfff0:             // JPGn
                    case 0xfff1:
                    case 0xfff2:
                    case 0xfff3:
                    case 0xfff4:
                    case 0xfff5:
                    case 0xfff6:
                    case 0xfff7:
                    case 0xfff8:
                    case 0xfff9:
                    case 0xfffa:
                    case 0xfffb:
                    case 0xfffc:
                    case 0xfffd:
                    case 0xfffe:             // COM
                        ms.Seek(br.ReadUInt16() - 2, SeekOrigin.Current);
                        break;

                    case 0xff01:             // TEM
                        break;

                    default:
                        int b1 = br.ReadByte();
                        int b2 = br.ReadByte();
                        if (b1 == 0xff && b2 > 2 && b2 <= 0xbf)                 // RES reserved markers
                        {
                            break;
                        }
                        else
                        {
                            throw new DicomCodecException("Unable to determine bit depth: JPEG syntax error!");
                        }
                    }
                }
                throw new DicomCodecException("Unable to determine bit depth: no JPEG SOF marker found!");
            }