/// <summary>Anonymizes a dataset witout cloning</summary> /// <param name="dataset">The dataset to be altered</param> public void AnonymizeInPlace(DicomDataset dataset) { var toRemove = new List <DicomItem>(); var itemList = dataset.ToArray(); foreach (var item in itemList) { var element = item as DicomElement; if (element == null) { continue; } if (element.Tag.Equals(DicomTag.PatientName) && Profile.PatientName != null) { ReplaceString(dataset, element, Profile.PatientName); } else if (element.Tag.Equals(DicomTag.PatientID) && Profile.PatientID != null) { ReplaceString(dataset, element, Profile.PatientID); } var parenthesis = new[] { '(', ')' }; var tag = item.Tag.ToString().Trim(parenthesis); var action = Profile.FirstOrDefault(pair => pair.Key.IsMatch(tag)); if (action.Key != null) { var vr = item.ValueRepresentation; switch (action.Value) { case SecurityProfileActions.U: // UID case SecurityProfileActions.C: // Clean case SecurityProfileActions.D: // Dummy if (vr == DicomVR.UI) { ReplaceUID(dataset, element); } else if (vr.IsString) { ReplaceString(dataset, element, "ANONYMOUS"); } else { BlankElement(dataset, element); } break; case SecurityProfileActions.K: // Keep break; case SecurityProfileActions.X: // Remove toRemove.Add(element); break; case SecurityProfileActions.Z: // Zero-length BlankElement(dataset, element); break; default: throw new ArgumentOutOfRangeException(); } } } dataset.Remove(item => toRemove.Contains(item)); }
/// <summary>Anonymizes a dataset witout cloning</summary> /// <param name="dataset">The dataset to be altered</param> public void AnonymizeInPlace(DicomDataset dataset) { var toRemove = new List <DicomItem>(); var itemList = dataset.ToArray(); var encoding = DicomEncoding.Default; if (dataset.TryGetSingleValue <string>(DicomTag.SpecificCharacterSet, out var characterSet)) { encoding = DicomEncoding.GetEncoding(characterSet); } foreach (var item in itemList) { var parenthesis = new[] { '(', ')' }; var tag = item.Tag.ToString().Trim(parenthesis); var action = Profile.FirstOrDefault(pair => pair.Key.IsMatch(tag)); if (action.Key != null) { var vr = item.ValueRepresentation; switch (action.Value) { case SecurityProfileActions.U: // UID case SecurityProfileActions.C: // Clean case SecurityProfileActions.D: // Dummy if (vr == DicomVR.UI) { ReplaceUID(dataset, item); } else if (vr.ValueType == typeof(string)) { ReplaceString(dataset, encoding, item, "ANONYMOUS"); } else { BlankItem(dataset, item, true); } break; case SecurityProfileActions.K: // Keep break; case SecurityProfileActions.X: // Remove toRemove.Add(item); break; case SecurityProfileActions.Z: // Zero-length BlankItem(dataset, item, false); break; default: throw new ArgumentOutOfRangeException(nameof(action)); } } if (item.Tag.Equals(DicomTag.PatientName) && Profile.PatientName != null) { ReplaceString(dataset, encoding, item, Profile.PatientName); } else if (item.Tag.Equals(DicomTag.PatientID) && Profile.PatientID != null) { ReplaceString(dataset, encoding, item, Profile.PatientID); } } dataset.Remove(item => toRemove.Contains(item)); }