private Attributes extract(Attributes emf, int frame, String cuid) { Attributes sfgs = emf.getNestedDataset(Tag.SharedFunctionalGroupsSequence); if (sfgs == null) throw new IllegalArgumentException("Missing (5200,9229) Shared Functional Groups Sequence"); Attributes fgs = emf.getNestedDataset(Tag.PerFrameFunctionalGroupsSequence, frame); if (fgs == null) throw new IllegalArgumentException( "Missing (5200,9230) Per-frame Functional Groups Sequence Item for frame #" + (frame + 1)); Attributes dest = new Attributes(emf.size() * 2); dest.addNotSelected(emf, EXCLUDE_TAGS); addFunctionGroups(dest, sfgs); addFunctionGroups(dest, fgs); addPixelData(dest, emf, frame); dest.setString(Tag.SOPClassUID, VR.UI, cuid); dest.setString( Tag.SOPInstanceUID, VR.UI, uidMapper.get(dest.getString(Tag.SOPInstanceUID)) + '.' + (frame + 1)); dest.setString( Tag.InstanceNumber, VR.IS, createInstanceNumber(dest.getString(Tag.InstanceNumber, ""), frame)); dest.setString(Tag.ImageType, VR.CS, dest.getStrings(Tag.FrameType)); dest.remove(Tag.FrameType); if (!preserveSeriesInstanceUID) dest.setString( Tag.SeriesInstanceUID, VR.UI, uidMapper.get(dest.getString(Tag.SeriesInstanceUID))); adjustReferencedImages(dest, Tag.ReferencedImageSequence); adjustReferencedImages(dest, Tag.SourceImageSequence); return dest; }
private void adjustReferencedImages(Attributes attrs, int sqtag) { Sequence sq = attrs.getSequence(sqtag); if (sq == null) return; ArrayList<Attributes> newRefs = new ArrayList<Attributes>(); for (Iterator<Attributes> itr = sq.iterator(); itr.hasNext(); ) { Attributes ref = (Attributes) itr.next(); String cuid = legacySOPClassUID(ref.getString(Tag.ReferencedSOPClassUID)); if (cuid == null) continue; itr.remove(); String iuid = uidMapper.get(ref.getString(Tag.ReferencedSOPInstanceUID)); int[] frames = ref.getInts(Tag.ReferencedFrameNumber); int n = frames == null ? nofAccessor.getNumberOfFrames(iuid) : frames.length; ref.remove(Tag.ReferencedFrameNumber); ref.setString(Tag.ReferencedSOPClassUID, VR.UI, cuid); for (int i = 0; i < n; i++) { Attributes newRef = new Attributes(ref); newRef.setString( Tag.ReferencedSOPInstanceUID, VR.UI, iuid + '.' + (frames != null ? frames[i] : (i + 1))); newRefs.add(newRef); } } for (Attributes ref : newRefs) sq.add(ref); }