[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