[Insight-users] Bugs (maybe) in itkDicomImageIO.cxx and questions
Feng Ma
mafeng@hotmail.com
Fri, 18 Oct 2002 17:53:09 -0400
Hi,
I worked a little bit with file itkDicomImageIO.cxx to read CT dicom
files. I found a few place that are possibly bugs.
1. In method CanReadFile(), inputStream is not closed. Nor is it closed in
CheckTagTable(). I am not experienced in C++. Does an open stream need not
to be closed?
2. In method ReadImageInformation(), array value, spac1value, spac2value
are not freed in the end of this method. inFile stream is not closed.
Below are my questions.
1. Dicom header size. I printed out m_InputPosition, which is supposed to
be the dicom header size. I read one image and got the header size 2522
(which is a 512x512 2 bytes CT image, file size 526812). this number is
different from what I got from commecial merge library. The mergelib number
is 2524 which is closer to the guess 526812-512x512x2=2524. This happens in
many files. Is the header size reported by itkDicomImageIO class possibly
wrong?
2. Unable to read image position tag (0x0020 0x0032). This tag is very
important to determine the z-value of the dicom image in a volume. When I
add a segment of code to read this tag, method GoToTag() simply can not find
it. I posted my code segment here. The last few lines in the posted method
CheckTagTable() is what I added. I did rewind the file pointer before call
GoToTag(). What's could be wrong?
Btw, my ITK version is Oct 7 CVS version.
Thank you very much.
-Feng
**** Run output ****
fma@ctreg1:/r2net/space_fma1/vhds/test 728 %
../../Devel/ITKDebug/bin/DicomImageViewer
/r2net/space_fma2/data/LV00000500/LV00000500_152.dcm
Loading File: /r2net/space_fma2/data/LV00000500/LV00000500_152.dcm
Can not locate position tag 0x0020 0x0032
Header Size: 2522
...Done Loading File
**** Code segment of CheckTagTable() ****
bool DicomImageIO::CheckTagTable(std::ifstream & inputStream,std::list <Tag>
&TableOfTags) const
{
long int i, j;
long int max;
Tag tagcurrent;
unsigned char c;
char chaine[4];
i=0;
//0x7FE0 and 0x0010 is the last tag before data pixel
if(!DicomImageIO::GoToTheEndOfHeader(inputStream,i,tagcurrent))
{
return (false);
}
else
{
TableOfTags.push_back(tagcurrent);
max=i;
//start the reading of the Stream from the begining
inputStream.seekg(0);
i=0;
}
////0x0028 and 0x0010 >> tag before the number of rows
if(!DicomImageIO::GoToTag(inputStream,0x0028,0x0010,i,max,tagcurrent))
{
return false;
}
else
{
TableOfTags.push_back(tagcurrent);
}
//0x0028 and 0x0011 >> tag before the number of columns
if(!DicomImageIO::GoToTag(inputStream,0x0028,0x0011,i,max,tagcurrent))
{
return false;
}
else
{
TableOfTags.push_back(tagcurrent);
}
//0x0028 and 0x0030 >> tag before each the value of spacing
if(!DicomImageIO::GoToTag(inputStream,0x0028,0x0030,i,max,tagcurrent))
{
//if there is no information about the spacing, we set the value compt
to 0
tagcurrent.Balise1[1]=0x28;
tagcurrent.Balise1[0]=0x00;
tagcurrent.Balise2[1]=0x30;
tagcurrent.Balise2[0]=0x0;
tagcurrent.compt=0; //
TableOfTags.push_back(tagcurrent);
//start the reading of the Stream from the begining
inputStream.seekg(0);
i=0;
}
else
{
TableOfTags.push_back(tagcurrent);
}
//0x0028 and 0x0100 >> tag before the number of bits allocated
if(!DicomImageIO::GoToTag(inputStream,0x0028,0x0100,i,max,tagcurrent))
{
return false;
}
else
{
TableOfTags.push_back(tagcurrent);
}
//0x0028 and 0x0103 >> tag before the place of sample representation
if(!DicomImageIO::GoToTag(inputStream,0x0028,0x0103,i,max,tagcurrent))
{
return false;
}
else
{
TableOfTags.push_back(tagcurrent);
}
i = 0;
inputStream.seekg(0);
////0x0020 and 0x0032 >> tag before value of position
if(DicomImageIO::GoToTag( inputStream,0x0020,0x0032,
i,max,tagcurrent)){
std::cout << "Position tag located.\n";
}
else
std::cout << "Can not locate position tag 0x0020 0x0032\n";
return(true);
}
_________________________________________________________________
Get faster connections -- switch to MSN Internet Access!
http://resourcecenter.msn.com/access/plans/default.asp