0

さて、私がやっていることは、既存のDICOMファイルに新しいオーバーレイを追加して保存することです(DICOMファイルには2つのオーバーレイがあります)。すべてがエラーなしで保存され、両方のDICOMビューアSanteとClearCanvas-ワークステーションがファイルを開きますが、Santeのみが両方のオーバーレイを表示します。ここで、DICOMファイル内のタグを見ると、OverlayData(6000)の「VR」は「OW」であり、OverlayData(6002)の「VR」は「OB」です。だから私の問題は、「OW」の「VR」で新しいタグを作成する方法です。これは、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();」のようなメソッドがあるように思われます。「OW」の「VR」でタグを作成します。または、ClearCanvasidkにオーバーレイを追加するまったく異なる方法があるかもしれません...

4

1 に答える 1

1

さて、私の混乱は、私のプログラムのバグが原因でした。「0x0102」の代わりに要素「0x0100」を使用して「ビット位置」タグを作成しようとしました。OWとOBは関係ありません。

申し訳ありません...

于 2011-02-23T22:47:05.623 に答える