Esempio n. 1
0
        /// <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));
        }
Esempio n. 2
0
        /// <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));
        }