Exemple #1
0
        public void Decode(DcmDataset dataset, DcmPixelData oldPixelData, DcmPixelData newPixelData, DcmCodecParameters parameters)
        {
            DcmRleCodecParameters rleParams = parameters as DcmRleCodecParameters;

            if (rleParams == null)
            {
                rleParams = GetDefaultParameters() as DcmRleCodecParameters;
            }

            int pixelCount       = oldPixelData.ImageWidth * oldPixelData.ImageHeight;
            int numberOfSegments = oldPixelData.BytesAllocated * oldPixelData.SamplesPerPixel;

            byte[] frameData = new byte[newPixelData.UncompressedFrameSize];

            for (int i = 0; i < oldPixelData.NumberOfFrames; i++)
            {
                IList <ByteBuffer> rleData = oldPixelData.GetFrameFragments(i);
                RLEDecoder         decoder = new RLEDecoder(rleData);

                if (decoder.NumberOfSegments != numberOfSegments)
                {
                    throw new DicomCodecException("Unexpected number of RLE segments!");
                }

                for (int s = 0; s < numberOfSegments; s++)
                {
                    int sample = s / newPixelData.BytesAllocated;
                    int sabyte = s % newPixelData.BytesAllocated;

                    int pos, offset;

                    if (newPixelData.PlanarConfiguration == 0)
                    {
                        pos    = sample * newPixelData.BytesAllocated;
                        offset = newPixelData.SamplesPerPixel * newPixelData.BytesAllocated;
                    }
                    else
                    {
                        pos    = sample * newPixelData.BytesAllocated * pixelCount;
                        offset = newPixelData.BytesAllocated;
                    }

                    if (rleParams.ReverseByteOrder)
                    {
                        pos += sabyte;
                    }
                    else
                    {
                        pos += newPixelData.BytesAllocated - sabyte - 1;
                    }

                    decoder.DecodeSegment(s, frameData, pos, offset);
                }

                newPixelData.AddFrame(frameData);
            }
        }
Exemple #2
0
        public void Decode(DcmDataset dataset, DcmPixelData oldPixelData, DcmPixelData newPixelData, DcmCodecParameters parameters)
        {
            if (oldPixelData.NumberOfFrames == 0)
            {
                return;
            }

            // Determine JPEG image precision and assert that the implemented codec supports this precision
            int precision;

            try
            {
                precision = JpegHelper.ScanHeaderForBitDepth(oldPixelData);
            }
            catch (DicomCodecException)
            {
                precision = oldPixelData.BitsStored;
            }
            AssertImagePrecision(precision);

            // Ensure consistency in the new pixel data header
            if (precision > 8)
            {
                newPixelData.BitsAllocated = 16;
            }
            else if (newPixelData.BitsStored <= 8)
            {
                newPixelData.BitsAllocated = 8;
            }

            // Set up new pixel data specifics
            newPixelData.PhotometricInterpretation = newPixelData.PhotometricInterpretation.Equals("YBR_FULL_422") ||
                                                     newPixelData.PhotometricInterpretation.Equals("YBR_PARTIAL_422")
                                                         ? "YBR_FULL"
                                                         : oldPixelData.PhotometricInterpretation;
            if (newPixelData.PhotometricInterpretation.Equals("YBR_FULL"))
            {
                newPixelData.PlanarConfiguration = 1;
            }

            try
            {
                for (int j = 0; j < oldPixelData.NumberOfFrames; ++j)
                {
                    var frameData  = new byte[newPixelData.UncompressedFrameSize];
                    var jpegStream = new MemoryStream(oldPixelData.GetFrameDataU8(j));

                    // Decode JPEG from stream
                    var decoder     = new JpegDecoder(jpegStream);
                    var jpegDecoded = decoder.Decode();
                    var img         = jpegDecoded.Image;

                    // Init Buffer
                    int w = img.Width;
                    int h = img.Height;
                    var pixelsFromJpeg = img.Raster;

                    // Copy FluxJpeg buffer into frame data array

/*
 *                  int comps = pixelsFromJpeg.GetLength(0);
 *                  int preIncr = newPixelData.BytesAllocated - comps;
 *
 *                  if (preIncr < 0)
 *                      throw new InvalidOperationException(
 *                          String.Format("Number of JPEG components: {0} exceeds number of bytes allocated: {1}",
 *                                        comps, newPixelData.BytesAllocated));
 */
                    int i = 0;
                    for (int y = 0; y < h; ++y)
                    {
                        for (int x = 0; x < w; ++x)
                        {
                            var pixel = pixelsFromJpeg[0][x, y];
                            frameData[i++] = (byte)((pixel >> 8) & 0xff);
                            frameData[i++] = (byte)(pixel & 0xff);
//                            for (int k = 0; k < preIncr; ++k) frameData[i++] = 0xff;
//                            for (int k = 0; k < comps; ++k) frameData[i++] = pixelsFromJpeg[k][x, y];
                        }
                    }

                    oldPixelData.Unload();

                    if (newPixelData.IsPlanar)
                    {
                        DcmCodecHelper.ChangePlanarConfiguration(frameData,
                                                                 frameData.Length / newPixelData.BytesAllocated,
                                                                 newPixelData.BitsAllocated,
                                                                 newPixelData.SamplesPerPixel, 0);
                    }
                    newPixelData.AddFrame(frameData);
                }
            }
            catch (Exception e)
            {
                Debug.Log.Error("Failed to decode JPEG image: {0}, reason: {1}", e.StackTrace, e.Message);
            }
        }
Exemple #3
0
        public void Encode(DcmDataset dataset, DcmPixelData oldPixelData, DcmPixelData newPixelData, DcmCodecParameters parameters)
        {
            DcmRleCodecParameters rleParams = parameters as DcmRleCodecParameters;

            if (rleParams == null)
            {
                rleParams = GetDefaultParameters() as DcmRleCodecParameters;
            }

            int pixelCount       = oldPixelData.ImageWidth * oldPixelData.ImageHeight;
            int numberOfSegments = oldPixelData.BytesAllocated * oldPixelData.SamplesPerPixel;

            for (int i = 0; i < oldPixelData.NumberOfFrames; i++)
            {
                RLEEncoder encoder   = new RLEEncoder();
                byte[]     frameData = oldPixelData.GetFrameDataU8(i);

                for (int s = 0; s < numberOfSegments; s++)
                {
                    encoder.NextSegment();

                    int sample = s / oldPixelData.BytesAllocated;
                    int sabyte = s % oldPixelData.BytesAllocated;

                    int pos;
                    int offset;

                    if (newPixelData.PlanarConfiguration == 0)
                    {
                        pos    = sample * oldPixelData.BytesAllocated;
                        offset = numberOfSegments;
                    }
                    else
                    {
                        pos    = sample * oldPixelData.BytesAllocated * pixelCount;
                        offset = oldPixelData.BytesAllocated;
                    }

                    if (rleParams.ReverseByteOrder)
                    {
                        pos += sabyte;
                    }
                    else
                    {
                        pos += oldPixelData.BytesAllocated - sabyte - 1;
                    }

                    for (int p = 0; p < pixelCount; p++)
                    {
                        if (pos >= frameData.Length)
                        {
                            throw new DicomCodecException("");
                        }
                        encoder.Encode(frameData[pos]);
                        pos += offset;
                    }
                    encoder.Flush();
                }

                encoder.MakeEvenLength();

                newPixelData.AddFrame(encoder.GetBuffer());
            }
        }
        public string MakeGreyDicom(byte[] greybytes, ushort imgwidth, ushort imgheight)
        {
            DcmUID     studyUid  = DcmUID.Generate();
            DcmUID     seriesUid = DcmUID.Generate(studyUid, 1);
            DcmUID     instUid   = DcmUID.Generate(seriesUid, 1);
            DcmDataset data      = new DcmDataset(DcmTS.ExplicitVRBigEndian);      //.ImplicitVRLittleEndian  ok

            data.AddElementWithValue(DcmTags.SOPClassUID, DcmUIDs.CTImageStorage); //ComputedRadiographyImageStorage  ok
            //data.AddElementWithValue(DcmTags.SOPClassUID, DcmUIDs .SecondaryCapture);
            data.AddElementWithValue(DcmTags.StudyInstanceUID, studyUid);
            data.AddElementWithValue(DcmTags.SeriesInstanceUID, seriesUid);
            data.AddElementWithValue(DcmTags.SOPInstanceUID, instUid);//"1.3.6.1.4.1.30071.6.635719267134010719.1.1"

            //data.AddElementWithValue(DcmTags.MediaStorageSOPClassUID, DcmUIDs.ImplicitVRLittleEndian);
            //data.AddElementWithValueString(DcmTags.MediaStorageSOPClassUID, DcmUIDs.ComputedRadiographyImageStorage.ToString());

            //type 2 attributes
            ////data.AddElement(DcmTags.PrinterStatus);
            if (tags.ContainsKey("0010,0020"))
            {
                data.AddElementWithValueString(DcmTags.PatientID, tags["0010,0020"].Substring(5));
            }
            if (tags.ContainsKey("0010,0010"))
            {
                data.AddElementWithValueString(DcmTags.PatientsName, tags["0010,0010"].Substring(5));
            }
            if (tags.ContainsKey("0010,0030"))
            {
                data.AddElementWithValueString(DcmTags.PatientsBirthDate, tags["0010,0030"].Substring(5));
            }
            if (tags.ContainsKey("0010,0040"))
            {
                data.AddElementWithValueString(DcmTags.PatientsSex, tags["0010,0040"].Substring(5));
            }
            if (tags.ContainsKey("0010,1010"))
            {
                data.AddElementWithValueString(DcmTags.PatientsAge, tags["0010,1010"].Substring(5));
            }

            if (tags.ContainsKey("0008,0005"))
            {
                data.AddElementWithValueString(DcmTags.SpecificCharacterSet, tags["0008,0005"].Substring(5));
            }
            if (tags.ContainsKey("0008,0008"))
            {
                data.AddElementWithValueString(DcmTags.ImageType, tags["0008,0008"].Substring(5));
            }
            //if (tags.ContainsKey("0008,0016"))
            //    data.AddElementWithValueString(DcmTags.ContentTime, DateTime.Now.ToString());
            //if (tags.ContainsKey("0008,0018"))
            //    data.AddElementWithValueString(DcmTags.ContentTime, DateTime.Now.ToString());
            if (tags.ContainsKey("0008,0020"))
            {
                data.AddElementWithValueString(DcmTags.StudyDate, tags["0008,0020"].Substring(5));
            }
            if (tags.ContainsKey("0008,0021"))
            {
                data.AddElementWithValueString(DcmTags.SeriesDate, tags["0008,0021"].Substring(5));
            }
            if (tags.ContainsKey("0008,0022"))
            {
                data.AddElementWithValueString(DcmTags.AcquisitionDate, tags["0008,0022"].Substring(5));
            }
            if (tags.ContainsKey("0008,0023"))
            {
                data.AddElementWithValueString(DcmTags.ContentDate, tags["0008,0023"].Substring(5));
            }
            if (tags.ContainsKey("0008,002a"))
            {
                data.AddElementWithValueString(DcmTags.AcquisitionDateTime, tags["0008,002a"].Substring(5));
            }
            if (tags.ContainsKey("0008,0030"))
            {
                data.AddElementWithValueString(DcmTags.StudyTime, tags["0008,0030"].Substring(5));
            }
            if (tags.ContainsKey("0008,0031"))
            {
                data.AddElementWithValueString(DcmTags.SeriesTime, tags["0008,0031"].Substring(5));
            }
            if (tags.ContainsKey("0008,0032"))
            {
                data.AddElementWithValueString(DcmTags.AcquisitionTime, tags["0008,0032"].Substring(5));
            }
            if (tags.ContainsKey("0008,0033"))
            {
                data.AddElementWithValueString(DcmTags.ContentTime, tags["0008,0033"].Substring(5));
            }

            if (tags.ContainsKey("0008,0050"))
            {
                data.AddElementWithValueString(DcmTags.AcquisitionNumber, tags["0008,0050"].Substring(5));
            }
            if (tags.ContainsKey("0008,0060"))
            {
                data.AddElementWithValueString(DcmTags.Modality, tags["0008,0060"].Substring(5));
            }
            if (tags.ContainsKey("0008,0070"))
            {
                data.AddElementWithValueString(DcmTags.Manufacturer, tags["0008,0070"].Substring(5));
            }
            if (tags.ContainsKey("0008,0080"))
            {
                data.AddElementWithValueString(DcmTags.InstitutionName, tags["0008,0080"].Substring(5));
            }
            if (tags.ContainsKey("0008,0081"))
            {
                data.AddElementWithValueString(DcmTags.InstitutionAddress, tags["0008,0081"].Substring(5));
            }
            if (tags.ContainsKey("0008,0090"))
            {
                data.AddElementWithValueString(DcmTags.ReferringPhysiciansName, tags["0008,0090"].Substring(5));
            }
            if (tags.ContainsKey("0008,1010"))
            {
                data.AddElementWithValueString(DcmTags.StationName, tags["0008,1010"].Substring(5));
            }
            if (tags.ContainsKey("0008,1030"))
            {
                data.AddElementWithValueString(DcmTags.StudyDescription, tags["0008,1030"].Substring(5));
            }
            if (tags.ContainsKey("0008,103e"))
            {
                data.AddElementWithValueString(DcmTags.SeriesDescription, tags["0008,103e"].Substring(5));
            }
            if (tags.ContainsKey("0008,1090"))
            {
                data.AddElementWithValueString(DcmTags.ManufacturersModelName, tags["0008,1090"].Substring(5));
            }

            if (tags.ContainsKey("0018,0010"))
            {
                data.AddElementWithValueString(DcmTags.ContrastBolusAgent, tags["0018,0010"].Substring(5));
            }
            if (tags.ContainsKey("0018,0015"))
            {
                data.AddElementWithValueString(DcmTags.BodyPartExamined, tags["0018,0015"].Substring(5));
            }
            if (tags.ContainsKey("0018,0050"))
            {
                data.AddElementWithValueString(DcmTags.SliceThickness, tags["0018,0050"].Substring(5));
            }
            if (tags.ContainsKey("0018,0060"))
            {
                data.AddElementWithValueString(DcmTags.KVP, tags["0018,0060"].Substring(5));
            }
            if (tags.ContainsKey("0018,0090"))
            {
                data.AddElementWithValueString(DcmTags.DataCollectionDiameter, tags["0018,0090"].Substring(5));
            }
            if (tags.ContainsKey("0018,1000"))
            {
                data.AddElementWithValueString(DcmTags.DeviceSerialNumber, tags["0018,1000"].Substring(5));
            }
            if (tags.ContainsKey("0018,1020"))
            {
                data.AddElementWithValueString(DcmTags.SoftwareVersions, tags["0018,1020"].Substring(5));
            }
            if (tags.ContainsKey("0018,1030"))
            {
                data.AddElementWithValueString(DcmTags.ProtocolName, tags["0018,1030"].Substring(5));
            }
            if (tags.ContainsKey("0018,1041"))
            {
                data.AddElementWithValueString(DcmTags.ContrastBolusVolume, tags["0018,1041"].Substring(5));
            }
            if (tags.ContainsKey("0018,1042"))
            {
                data.AddElementWithValueString(DcmTags.ContrastBolusStartTime, tags["0018,1042"].Substring(5));
            }
            if (tags.ContainsKey("0018,1043"))
            {
                data.AddElementWithValueString(DcmTags.ContrastBolusStopTime, tags["0018,1043"].Substring(5));
            }
            if (tags.ContainsKey("0018,1044"))
            {
                data.AddElementWithValueString(DcmTags.ContrastBolusTotalDose, tags["0018,1044"].Substring(5));
            }
            if (tags.ContainsKey("0018,1046"))
            {
                data.AddElementWithValueString(DcmTags.ContrastFlowRate, tags["0018,1046"].Substring(5));
            }
            if (tags.ContainsKey("0018,1047"))
            {
                data.AddElementWithValueString(DcmTags.ContrastFlowDuration, tags["0018,1047"].Substring(5));
            }
            if (tags.ContainsKey("0018,1049"))
            {
                data.AddElementWithValueString(DcmTags.ContrastBolusIngredientConcentration, tags["0018,1049"].Substring(5));
            }
            if (tags.ContainsKey("0018,1100"))
            {
                data.AddElementWithValueString(DcmTags.ReconstructionDiameter, tags["0018,1100"].Substring(5));
            }
            if (tags.ContainsKey("0018,1110"))
            {
                data.AddElementWithValueString(DcmTags.DistanceSourceToDetector, tags["0018,1110"].Substring(5));
            }
            if (tags.ContainsKey("0018,1111"))
            {
                data.AddElementWithValueString(DcmTags.DistanceSourceToPatient, tags["0018,1111"].Substring(5));
            }
            if (tags.ContainsKey("0018,1120"))
            {
                data.AddElementWithValueString(DcmTags.GantryDetectorTilt, tags["0018,1120"].Substring(5));
            }
            if (tags.ContainsKey("0018,1130"))
            {
                data.AddElementWithValueString(DcmTags.TableHeight, tags["0018,1130"].Substring(5));
            }
            if (tags.ContainsKey("0018,1140"))
            {
                data.AddElementWithValueString(DcmTags.RotationDirection, tags["0018,1140"].Substring(5));
            }
            if (tags.ContainsKey("0018,1150"))
            {
                data.AddElementWithValueString(DcmTags.ExposureTime, tags["0018,1150"].Substring(5));
            }
            if (tags.ContainsKey("0018,1151"))
            {
                data.AddElementWithValueString(DcmTags.XRayTubeCurrent, tags["0018,1151"].Substring(5));
            }
            if (tags.ContainsKey("0018,1152"))
            {
                data.AddElementWithValueString(DcmTags.Exposure, tags["0018,1152"].Substring(5));
            }
            if (tags.ContainsKey("0018,1160"))
            {
                data.AddElementWithValueString(DcmTags.FilterType, tags["0018,1160"].Substring(5));
            }
            if (tags.ContainsKey("0018,1170"))
            {
                data.AddElementWithValueString(DcmTags.GeneratorPower, tags["0018,1170"].Substring(5));
            }
            if (tags.ContainsKey("0018,1190"))
            {
                data.AddElementWithValueString(DcmTags.FocalSpots, tags["0018,1190"].Substring(5));
            }
            if (tags.ContainsKey("0018,1200"))
            {
                data.AddElementWithValueString(DcmTags.DateOfLastCalibration, tags["0018,1200"].Substring(5));
            }
            if (tags.ContainsKey("0018,1201"))
            {
                data.AddElementWithValueString(DcmTags.TimeOfLastCalibration, tags["0018,1201"].Substring(5));
            }
            if (tags.ContainsKey("0018,1210"))
            {
                data.AddElementWithValueString(DcmTags.ConvolutionKernel, tags["0018,1210"].Substring(5));
            }
            if (tags.ContainsKey("0018,5100"))
            {
                data.AddElementWithValueString(DcmTags.PatientPosition, tags["0018,5100"].Substring(5));
            }

            //if (tags.ContainsKey("0020,000D"))
            //    data.AddElementWithValueString(DcmTags.ContrastBolusStopTime, DateTime.Now.ToString());
            //if (tags.ContainsKey("0020,000E"))
            //    data.AddElementWithValueString(DcmTags.ContrastBolusStopTime, DateTime.Now.ToString());
            if (tags.ContainsKey("0020,0010"))
            {
                data.AddElementWithValueString(DcmTags.StudyID, tags["0020,0010"].Substring(5));
            }
            if (tags.ContainsKey("0020,0011"))
            {
                data.AddElementWithValueString(DcmTags.SeriesNumber, tags["0020,0011"].Substring(5));
            }
            if (tags.ContainsKey("0020,0012"))
            {
                data.AddElementWithValueString(DcmTags.AccessionNumber, tags["0020,0012"].Substring(5));
            }
            if (tags.ContainsKey("0020,0013"))
            {
                data.AddElementWithValueString(DcmTags.InstanceNumber, tags["0020,0013"].Substring(5));
            }
            if (tags.ContainsKey("0020,0032"))
            {
                data.AddElementWithValueString(DcmTags.ImagePositionPatient, tags["0020,0032"].Substring(5));
            }
            if (tags.ContainsKey("0020,0037"))
            {
                data.AddElementWithValueString(DcmTags.ImageOrientationPatient, tags["0020,0037"].Substring(5));
            }
            if (tags.ContainsKey("0020,0052"))
            {
                data.AddElementWithValueString(DcmTags.FrameOfReferenceUID, tags["0020,0052"].Substring(5));
            }
            if (tags.ContainsKey("0020,1040"))
            {
                data.AddElementWithValueString(DcmTags.PositionReferenceIndicator, tags["0020,1040"].Substring(5));
            }
            if (tags.ContainsKey("0020,1041"))
            {
                data.AddElementWithValueString(DcmTags.SliceLocation, tags["0020,1041"].Substring(5));
            }
            if (tags.ContainsKey("0020,4000"))
            {
                data.AddElementWithValueString(DcmTags.ImageComments, tags["0020,4000"].Substring(5));
            }



            //data.AddElementWithValueString(DcmTags.StudyTime, DateTime.Now.ToString());
            //data.AddElementWithValueString(DcmTags.AccessionNumber, "");
            //data.AddElementWithValueString(DcmTags.ReferringPhysiciansName, "");
            //data.AddElementWithValueString(DcmTags.StudyID, "1");
            //data.AddElementWithValueString(DcmTags.SeriesNumber, "1");
            //data.AddElementWithValueString(DcmTags.ModalitiesInStudy, "CT");//CR
            //data.AddElementWithValueString(DcmTags.Modality, "CT");//CR
            //data.AddElementWithValueString(DcmTags.NumberOfStudyRelatedInstances, "1");
            //data.AddElementWithValueString(DcmTags.NumberOfStudyRelatedSeries, "1");
            //data.AddElementWithValueString(DcmTags.NumberOfSeriesRelatedInstances, "1");
            //data.AddElementWithValueString(DcmTags.PatientOrientation, "HFS");//F/A
            //data.AddElementWithValueString(DcmTags.ImageLaterality, "U");
            if (tags.ContainsKey("0028,1050"))
            {
                data.AddElementWithValueString(DcmTags.WindowCenter, "1113");
            }
            if (tags.ContainsKey("0028,1051"))
            {
                data.AddElementWithValueString(DcmTags.WindowWidth, "749");
            }
            //data.AddElementWithValueString(DcmTags.WindowCenterWidthExplanation, "WINDOW1\\WINDOW2");
            data.AddElementWithValueString(DcmTags.PixelRepresentation, "0");
            data.AddElementWithValueString(DcmTags.RescaleIntercept, "0");//0
            data.AddElementWithValueString(DcmTags.RescaleSlope, "1");
            //data.AddElementWithValueString(DcmTags.RotationDirection, "CW");
            //ushort bitdepth = 2;未使用过

            DcmPixelData pixelData = new DcmPixelData(DcmTS.ImplicitVRLittleEndian);

            pixelData.PixelRepresentation = 0;//ok
            pixelData.ImageWidth          = imgwidth;
            pixelData.ImageHeight         = imgheight;

            pixelData.SamplesPerPixel = 1;  //ok
            pixelData.HighBit         = 15; //ok
            pixelData.BitsStored      = 16; //ok
            pixelData.BitsAllocated   = 16; //ok
            //pixelData.SamplesPerPixel = 1;
            //pixelData.HighBit = 7;
            //pixelData.BitsStored = 8;
            //pixelData.BitsAllocated = 8;
            pixelData.ImageType = "ORIGINAL\\PRIMARY\\AXIAL";
            pixelData.PhotometricInterpretation = "MONOCHROME2";//2 byte gray? //ok

            //pixelData.FragmentSize
            //pixelData.IsLossy = true;
            //pixelData.LossyCompressionMethod = "01";
            pixelData.PixelDataElement = DcmElement.Create(DcmTags.PixelData, DcmVR.OW); //OB: Other Byte, OW: Other Word

            //pixelData.AddFrame(bmpBytes);
            pixelData.AddFrame(greybytes);

            pixelData.UpdateDataset(data);
            DicomFileFormat ff = new DicomFileFormat(data);

            //string fileout = System.IO.Path.Combine(Directory.GetCurrentDirectory(), "greyimg_test.dcm");
            ff.Save(fileout, Dicom.DicomWriteOptions.Default);//Default
            ff = null;
            return(fileout);
        }