Хорошо, так что я делаю, добавляя новый оверлей к существующему файлу DICOM и сохраняя его (теперь у файла DICOM есть два оверлея). Все сохраняется без ошибок, и оба средства просмотра DICOM Sante и ClearCanvas-Workstation открывают файл, но только Sante отображает оба наложения.
Теперь, когда я смотрю на теги в файле DICOM, OverlayData (6000) «VR» - это «OW», а OverlayData (6002) «VR» - это «OB».
Поэтому моя проблема заключается в том, как создать новый тег с «VR», равным «OW», потому что он является правильным для использования для OverlayData.
Вот код, который я использую для добавления нового наложения в DicomFile.DataSet ::
ПРИМЕЧАНИЕ: после создания наложения я записываю в него данные видимых пикселей.
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);
}
Так что мне кажется, что есть такой метод, как 'DicomFile.DataSet [dataTag] .SetNullValue ();' создать тег с «VR» из «OW». Или, может быть, есть совершенно другой способ добавить оверлей в ClearCanvas idk ...