番外編 DICOM画像とNAS その9 1.やるべき事が、まだまだ沢山ありますが、
string dirct = folderBrowserDialog1.SelectedPath;
if (dirct ==
"C:\\")
if (nfiles !=
0)
//scan後、getKeys()は、有効なDICOM filesを列挙する。
if (f3.Count() !=
0)
}
nfiles = d.Load(subFolders[i]);
if (nfiles !=
0)
bool b4 =
s.Scan(d.GetFilenames());
//scan後、getKeys()は、有効なDICOM filesを列挙する。
if (f3.Count() !=
0)
}
treeView1.BackColor =
Color.Chartreuse;
//////////////////////////////////////////////////
gdcm.DataSet ds = reader.GetFile().GetDataSet();
//Patient
name
else
擬似カラー表示も追加しました
取りあえず
水平、垂直鏡像、
CTのウィンドウレベル及びウィンドウ幅の調整、及び、簡単な自動調整
白黒反転、90度左右回転
擬似カラーでの表示
他病院からのDICOM画像の閲覧
を、追加しました。
CTのウィンドウレベル及びウィンドウ幅の調整(マウス右ボタン:上下左右ドラッグ)を行うと
擬似カラーも変化します。
次に
他病院からのDICOM画像の閲覧する時
CDのディレクトリーを直接指定するか、CD画像をハード-ディスクにコピーして
そのディレクトリーを指定します。 ( @のボタンを押す )
尚、Aの所は、選択したマウスの機能を、表示しています。
マウスの左右クリック等で、その時の機能を表示します。
ディレクトリーを選択すると、
選択したディレクトリー内及び、選択したディレクトリー以下のサブディレクトリー内の、全てのDICOM画像が、抽出されます。
うーむ、
今まで、DICOM画像でみた事もない、画像が表示されますね。
ディレクトリー内のDICOMファイルの抽出は、GDCM::Scannerの力を、お借りしました。
今回のプログラムの一部です。
/////////////////////////////////////////////////////////////////////////////////
private void toolStripButton6_Click(object sender, EventArgs
e)
{
read_from_Directory = !read_from_Directory;
if
(read_from_Directory)
{
................
DialogResult result =
folderBrowserDialog1.ShowDialog();
if (result ==
DialogResult.OK)
{
{
MessageBox.Show("このDirectoryの検索は中止します。");
....................................
read_from_Directory =
false;
return;
}
...............
gdcm.Directory d = new gdcm.Directory();
p_info_LIST.Clear();
Cursor.Current =
Cursors.WaitCursor;
uint
nfiles;
nfiles = d.Load(dirct);
{
Scanner s = new
Scanner();
Tag t = new Tag(0x8,
0x8);
//add Tag(t) is necessary
s.AddTag(t);
//d.GetFilenames()で得たファイルは、DICOMファイル以外も含む
FilenamesType files =
d.GetFilenames();
int files_number =
files.Count();
bool b4 =
s.Scan(d.GetFilenames());
if
(b4)
{
FilenamesType f3 = s.GetKeys();
{
p_info.objects_number =
f3.Count();
string key =
f3[0];
gdcm_read_file_contents(key);
p_info.ObjectFile =
key;
p_info.dirs_oblectfiles =
f3.ToArray();
p_info_LIST.Add(p_info);
}
}
string[] subFolders =
System.IO.Directory.GetDirectories(
dirct, "*",
System.IO.SearchOption.AllDirectories);
int numberOfSubdirectory =
subFolders.Count();
if (numberOfSubdirectory !=
0)
{
for (int i = 0; i < numberOfSubdirectory;
i++)
{
{
Scanner s = new
Scanner();
Tag t = new Tag(0x8,
0x8);
//add Tag(t) is necessary
s.AddTag(t);
//d.GetFilenames()で得たファイルは、DICOMファイル以外も含む
if
(b4)
{
FilenamesType f3 = s.GetKeys();
{
p_info.objects_number =
f3.Count();
string key =
f3[0];
gdcm_read_file_contents(key);
p_info.ObjectFile =
key;
p_info.dirs_oblectfiles =
f3.ToArray();
p_info_LIST.Add(p_info);
}
}
}
}
OnRecordEnum_OnTreeview(null,
null);
treeView1.BackColor =
Color.Chartreuse;
}
else
{
toolStripButton6.BackColor =
Color.LemonChiffon;
read_from_Directory =
false;
toolStripButton2_Click(null,
null);
toolStripButton6.Text =
"Directoryから読み込む";
treeView1.BackColor =
Color.Chartreuse;
}
}
else
{
adjust_window_level =
false;
toolStripButton6.BackColor =
Color.LemonChiffon;
toolStripButton2_Click(null,
null);
toolStripButton6.Text =
"Directoryから読み込む";
textBox1.Enabled =
true;
textBox2.Enabled =
true;
toolStripTextBox1.Enabled =
true;
toolStripTextBox2.Enabled =
true;
treeView1.BackColor =
Color.Chartreuse;
}
Cursor.Current =
Cursors.Default;
}
尚、他病院からの患者名は、DICOM画像のTagから取得しましたが
日本語もバッチリです。
/////////////////////////////////////////////////////////////////////////////////
//GDCM
part
gdcm.ImageReader reader = new
gdcm.ImageReader();
reader.SetFileName(file_name);
if
(!reader.Read())
{
return;
}
StringFilter sf = new
gdcm.StringFilter();
sf.SetFile(reader.GetFile());
//////////////////////////////////////////////////
gdcm.Image image =
reader.GetImage();
p_info.height =
(int)image.GetRows();
p_info.width =
(int)image.GetColumns();
p_info.origin_Data = new short[p_info.width *
p_info.height];
image.GetArray(p_info.origin_Data);
if (ds.GetDataElement(new gdcm.Tag(0x10,
0x10)).IsEmpty())
p_info.name = "UNKNOWN";
{
byte[] bytesData = new
byte[50];
ByteValue bv = ds.GetDataElement(new gdcm.Tag(0x10,
0x10)).GetByteValue();
bv.GetBuffer(bytesData,
bv.GetLength());
p_info.name =
encISO2022.GetString(bytesData);
int len =
p_info.name.IndexOf('\0');
p_info.name = p_info.name.Substring(0,
len);
p_info.name = p_info.name.Replace("^", "
");
p_info.name =
p_info.name.Trim('=');
p_info.name = Microsoft.VisualBasic.Strings.StrConv(p_info.name,
VbStrConv.Narrow);//to
半角カナ
}
/////////////////////////////////////////////////////////////////////////////////
次に
水平、垂直鏡像等は、右クリックで、表示されます。
数字キーでも、
一発で、windowレベル 、window
widthを、調整できるようにしました。
thanks to Dr. AKASAKA
先生。
私の関与する病院は、療養型病院なので、
これだけの機能で十分かな......
3Dも、興味あるのですが.....(^_^;;
H.24.4.15