//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); }
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); }