예제 #1
0
        //pixel data is not cloned.
        public PixelDataInfo Clone()
        {
            PixelDataInfo clone = (PixelDataInfo)CloneBuilder.Clone(this);

            clone.AspectRatio        = new PixelAspectRatio(AspectRatio.Row, AspectRatio.Column);
            clone.PixelSpacing       = new PixelSpacing(PixelSpacing.Row, PixelSpacing.Column);
            clone.ImagerPixelSpacing = new PixelSpacing(ImagerPixelSpacing.Row, ImagerPixelSpacing.Column);
            return(clone);
        }
        public void ChangeAspectRatio(DicomFile file)
        {
            if (NewAspectRatio.IsNull || FloatComparer.AreEqual(NewAspectRatio.Value, 1))
            {
                throw new InvalidOperationException("Invalid new aspect ratio");
            }

            if (file.TransferSyntax.Encapsulated)
            {
                file.ChangeTransferSyntax(TransferSyntax.ExplicitVrLittleEndian);
            }

            OldInfo = new PixelDataInfo(file.DataSet);
            if (!OldInfo.IsSquare)
            {
                throw new ArgumentException("Pixels are already non-square.");
            }

            NewInfo             = OldInfo.Clone();
            NewInfo.AspectRatio = NewAspectRatio;

            if (IncreasePixelDimensions)
            {
                if (NewAspectRatio.Value < 1)
                {
                    NewInfo.Rows = (int)(OldInfo.Rows / NewAspectRatio.Value + 0.5);
                }
                else
                {
                    NewInfo.Columns = (int)(OldInfo.Columns * NewAspectRatio.Value + 0.5);
                }
            }
            else
            {
                if (NewAspectRatio.Value < 1)
                {
                    NewInfo.Columns = (int)(OldInfo.Columns * NewAspectRatio.Value + 0.5);
                }
                else
                {
                    NewInfo.Rows = (int)(OldInfo.Rows / NewAspectRatio.Value + 0.5);
                }
            }

            float rowScale = OldInfo.Rows / (float)NewInfo.Rows;
            float colScale = OldInfo.Columns / (float)NewInfo.Columns;

            if (RemoveCalibration)
            {
                NewInfo.PixelSpacing       = new PixelSpacing(0, 0);
                NewInfo.ImagerPixelSpacing = new PixelSpacing(0, 0);
            }
            else
            {
                NewInfo.PixelSpacing       = new PixelSpacing(NewInfo.PixelSpacing.Row * rowScale, NewInfo.PixelSpacing.Column * colScale);
                NewInfo.ImagerPixelSpacing = new PixelSpacing(NewInfo.ImagerPixelSpacing.Row * rowScale, NewInfo.ImagerPixelSpacing.Column * colScale);
            }

            ValidateNewInfo();

            NewInfo.SeriesDescription = (OldInfo.SeriesDescription ?? "") + String.Format(" ({0}:{1}, dim/cal={2}/{3})",
                                                                                          NewAspectRatio.Row, NewAspectRatio.Column,
                                                                                          IncreasePixelDimensions ? "y" : "n",
                                                                                          NewInfo.IsCalibrated ? "y" : "n");

            NewInfo.PlanarConfiguration = 0;

            PixelData oldPixelData = OldInfo.GetPixelData();
            PixelData newPixelData = NewInfo.GetPixelData();

            for (int row = 0; row < NewInfo.Rows; ++row)
            {
                for (int column = 0; column < NewInfo.Columns; ++column)
                {
                    var sourcePoint  = new PointF(column * colScale, row * rowScale);
                    int interpolated = PerformBilinearInterpolationAt(oldPixelData, sourcePoint);
                    newPixelData.SetPixel(column, row, interpolated);
                }
            }

            NewInfo.SetPixelData(newPixelData);
            NewInfo.UpdateDataSet(file.DataSet);
        }