Question

Ok, so what i am doing is adding a new Overlay to an existing DICOM file & saving it(The DICOM file now has two overlays). Everything saves without errors & both DICOM viewers Sante & ClearCanvas-Workstation open the file, but only Sante displays both overlays. Now when I look at the tags within the DICOM file, the OverlayData(6000) 'VR' is 'OW' & the OverlayData(6002) 'VR' is 'OB'. So my problem is how to create a new Tag with a 'VR' of 'OW' because that is the correct one to use for OverlayData.

Here is the code i'm using to add the new Overlay to the DicomFile.DataSet:: NOTE, after I create the overlay I do write visible pixel data into it.

void AddOverlay()
{
            int newOverlayIndex = 0;
            for(int i = 0; i != 16; ++i)
            {
                if(!DicomFile.DataSet.Contains(GetOverlayTag(i, 0x3000)))
                {
                    newOverlayIndex = i;
                    break;
                }
            }

            //Columns
            uint columnsTag = GetOverlayTag(newOverlayIndex, 0x0011);
            DicomFile.DataSet[columnsTag].SetUInt16(0, (ushort)CurrentData.Width);
            //Rows
            uint rowTag = GetOverlayTag(newOverlayIndex, 0x0010);
            DicomFile.DataSet[rowTag].SetUInt16(0, (ushort)CurrentData.Height);
            //Type
            uint typeTag = GetOverlayTag(newOverlayIndex, 0x0040);
            DicomFile.DataSet[typeTag].SetString(0, "G");
            //Origin
            uint originTag = GetOverlayTag(newOverlayIndex, 0x0050);
            DicomFile.DataSet[originTag].SetUInt16(0, 1);
            DicomFile.DataSet[originTag].SetUInt16(1, 1);
            //Bits Allocted
            uint bitsAllocatedTag = GetOverlayTag(newOverlayIndex, 0x0100);
            DicomFile.DataSet[bitsAllocatedTag].SetUInt16(0, 1);
            //Bit Position
            uint bitPositionTag = GetOverlayTag(newOverlayIndex, 0x0100);
            DicomFile.DataSet[bitPositionTag].SetUInt16(0, 0);
            //Data
            uint dataTag = GetOverlayTag(newOverlayIndex, 0x3000);
            DicomFile.DataSet[dataTag].SetNullValue();//<<< Needs to be something else
            byte[] bits = new byte[(CurrentData.Width*CurrentData.Height)/8];
            for(int i = 0; i != bits.Length; ++i) bits[i] = 0;
            DicomFile.DataSet[dataTag].Values = bits;
}
public static uint GetOverlayTag(int overlayIndex, short element)
        {
            short group = (short)(0x6000 + (overlayIndex*2));
            byte[] groupBits = BitConverter.GetBytes(group);
            byte[] elementBtis = BitConverter.GetBytes(element);
            return BitConverter.ToUInt32(new byte[]{elementBtis[0], elementBtis[1], groupBits[0], groupBits[1]}, 0);
        }

So it would seem to me there would be some method like 'DicomFile.DataSet[dataTag].SetNullValue();' to create the tag with a 'VR' of 'OW'. Or maybe theres a totally different way to add an overlay in ClearCanvas idk...

Was it helpful?

Solution

Ok, my confusion was accually caused by a bug in my program. I was trying to create the "Bit Position" tag by using element "0x0100" instead of "0x0102". OW vs OB is irrelevant.

Sorry about that...

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top