Creating Frame-Specific DICOM Presentation State using DicomObjects
Sometimes we are asked about how to create frame-specific DICOM presentation state files for multiframe images. This is not difficult in DicomObjects and can by done in a slightly awkward way. Insteading of adding the entire "Referenced Series Sequence" to the top level of the presentation state file, all you need to do is adding the "Referenced Frame Number" item into "Referenced Image Sequence" under "Graphic Annotation Sequence", as shown in the following picture:
Content inside the red box is the top level sequence which you don't need to add. All you need to do is find the "Graphic Annotation Sequence" (0070, 0001), then the "Referenced Image Sequence" (0008, 1140) and add the "Referenced Frame Number" (0008, 1160) into it.
Below is some simple vb6 code to show you how to do it:
Dim ps As DicomDataSet
DicomViewer1.CurrentImage.CurrentToPresentationState True
Set ps = DicomViewer1.CurrentImage.PresentationState
Dim graphicAnnoSQ As DicomDataSet
Dim graphicAnnoSQItem As DicomDataSet
Set graphicAnnoSQ = ps.Attributes(&H70, 1).Value
Set graphicAnnoSQItem = graphicAnnoSQ(1)
Dim refImageSQ As DicomDataSet
Dim refImageSQItem As DicomDataSet
Set refImageSQ = graphicAnnoSQItem.Attributes(&H8, &H1140).Value
Set refImageSQItem = refImageSQ(1)
refImageSQItem.Attributes.Add &H8, &H1160, 13
ps.WriteFile psFilePath, True, "1.2.840.10008.1.2.1"
This should work equally well in the .NET version of DicomObjects. For furture development in the .NET version, we may add in a new method DicomDataSet.PresentationStateByFrame, we can also combine multiple presentation state into one so that people don't have to load them all and change the DicomImage.PresentationState property every time the user changes the Frame.