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. Instead 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 future 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.