Program: gdcm
Module: $RCSfile: TestAllReadCompareDicom.cxx,v $
Language: C++
- Date: $Date: 2005/03/31 08:06:21 $
- Version: $Revision: 1.33 $
+ Date: $Date: 2005/07/08 13:39:56 $
+ Version: $Revision: 1.44 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See Doc/License.txt or
#include "gdcmDirList.h"
#include "gdcmFile.h"
#include "gdcmFileHelper.h"
+#include "gdcmGlobal.h"
+#include "gdcmTS.h"
+#include "gdcmDebug.h"
#include <iostream>
-#include <fstream>
//Generated file:
#include "gdcmDataImages.h"
bool WriteFileHeader(std::ofstream *fp);
bool WriteFileData(std::ofstream *fp);
- uint8_t ReadInt8 (std::ifstream *fp) throw( std::ios::failure );
- uint16_t ReadInt16(std::ifstream *fp) throw( std::ios::failure );
- uint32_t ReadInt32(std::ifstream *fp) throw( std::ios::failure );
+ uint8_t ReadInt8 (std::ifstream *fp)
+#if !(__GNUC__==2 && __GNUC_MINOR__<=96)
+ throw( std::ios::failure );
+#else
+ ;
+#endif
+ uint16_t ReadInt16(std::ifstream *fp)
+#if !(__GNUC__==2 && __GNUC_MINOR__<=96)
+ throw( std::ios::failure );
+#else
+ ;
+#endif
+ uint32_t ReadInt32(std::ifstream *fp)
+#if !(__GNUC__==2 && __GNUC_MINOR__<=96)
+ throw( std::ios::failure );
+#else
+ ;
+#endif
void WriteInt8 (std::ofstream *fp,uint8_t value);
void WriteInt16(std::ofstream *fp,uint16_t value);
void WriteInt32(std::ofstream *fp,uint32_t value);
int sizeX;
int sizeY;
int sizeZ;
- int scalarSize;
- int components;
+ uint16_t scalarSize;
+ uint16_t components;
uint8_t *data;
int swapCode;
static const unsigned int HEADER_SIZE;
};
+const unsigned int MAX_NUMBER_OF_DIFFERENCE = 10;
const unsigned int TestFile::HEADER_SIZE = 20;
-TestFile::TestFile(void)
+TestFile::TestFile()
{
fileName = "";
readable=false;
sizeY = ReadInt32(fp); // Size Y
sizeZ = ReadInt32(fp); // Size Z
scalarSize = ReadInt16(fp)/8; // bits per scalar
- components = ReadInt16(fp); // Number of components
+ components = ReadInt16(fp); // Number of components
return(true);
}
WriteInt32(fp,sizeY); // Size Y
WriteInt32(fp,sizeZ); // Size Z
WriteInt16(fp,scalarSize*8); // bits per scalar
- WriteInt16(fp,components); // number of components
+ WriteInt16(fp,components); // number of components
return(true);
}
}
uint8_t TestFile::ReadInt8 (std::ifstream *fp)
+#if !(__GNUC__==2 && __GNUC_MINOR__<=96)
throw( std::ios::failure )
+#endif
{
uint8_t g;
fp->read ((char*)&g, (size_t)1);
+#if !(__GNUC__==2 && __GNUC_MINOR__<=96)
if ( fp->fail() )
throw std::ios::failure( "TestFile::ReadInt8() - file error." );
if( fp->eof() )
throw std::ios::failure( "TestFile::ReadInt8() - EOF." );
+#endif
return g;
}
uint16_t TestFile::ReadInt16(std::ifstream *fp)
+#if !(__GNUC__==2 && __GNUC_MINOR__<=96)
throw( std::ios::failure )
+#endif
{
uint16_t g;
fp->read ((char*)&g, (size_t)2);
+#if !(__GNUC__==2 && __GNUC_MINOR__<=96)
if ( fp->fail() )
throw std::ios::failure( "TestFile::ReadInt16() - file error." );
if( fp->eof() )
throw std::ios::failure( "TestFile::ReadInt16() - EOF." );
+#endif
#if defined(GDCM_WORDS_BIGENDIAN)
g = ( g << 8 | g >> 8 );
}
uint32_t TestFile::ReadInt32(std::ifstream *fp)
+#if !(__GNUC__==2 && __GNUC_MINOR__<=96)
throw( std::ios::failure )
+#endif
{
uint32_t g;
fp->read ((char*)&g, (size_t)4);
+#if !(__GNUC__==2 && __GNUC_MINOR__<=96)
if ( fp->fail() )
throw std::ios::failure( "TestFile::ReadInt32() - file error." );
if( fp->eof() )
throw std::ios::failure( "TestFile::ReadInt32() - EOF." );
+#endif
#if defined(GDCM_WORDS_BIGENDIAN)
g = ( (g<<24) | ((g<<8) & 0x00ff0000) |
////// Step 1:
std::cout << "1...";
- gdcm::FileHelper *tested = new gdcm::FileHelper( filename );
- if( !tested->GetFile()->IsReadable() )
+ gdcm::File *f = new gdcm::File();
+ f->SetFileName( filename );
+ f->Load();
+
+ if( !f->IsReadable() )
{
std::cout << " Failed" << std::endl
<< " Image not gdcm compatible:"
<< filename << std::endl;
- delete tested;
+ delete f;
return 1;
}
-
+ gdcm::FileHelper *tested = new gdcm::FileHelper( f );
+
////// Step 2:
////// Check for existence of reference baseline dicom file:
std::cout << "2...";
<< filename << std::endl;
delete reference;
delete tested;
+ delete f;
return 1;
}
<< reference->GetZSize() << std::endl;
delete reference;
delete tested;
+ delete f;
return 1;
}
<< reference->GetNumberOfComponents() << std::endl;
delete reference;
delete tested;
+ delete f;
return 1;
}
<< std::endl;
delete tested;
delete reference;
+ delete f;
return 1;
}
testedDataSize) != 0 )
{
(void)res;
+ std::string ts = tested->GetFile()->GetTransferSyntax();
+
std::cout << " Failed" << std::endl
<< " pixel ("
<< PixelType
<< ") differ (as expanded in memory)."
+ << std::endl
+ << " compression : "
+ << gdcm::Global::GetTS()->GetValue(ts) << std::endl;
+
+ std::cout << " list of the first " << MAX_NUMBER_OF_DIFFERENCE
+ << " pixels differing (pos : test - ref) :"
<< std::endl;
+ int i;
+ unsigned int j;
+ for(i=0, j=0;i<testedDataSize && j<MAX_NUMBER_OF_DIFFERENCE;i++)
+ {
+ if(testedImageData[i]!=referenceImageData[i])
+ {
+ std::cout << std::hex << "(" << i << " : "
+ << std::hex << (int)(testedImageData[i]) << " - "
+ << std::hex << (int)(referenceImageData[i]) << ") "
+ << std::dec;
+ ++j;
+ }
+ }
+ std::cout << std::endl;
+
delete tested;
delete reference;
+ delete f;
return 1;
}
//////////////// Clean up:
delete tested;
delete reference;
+ delete f;
std::cout << "OK." << std::endl;
int TestAllReadCompareDicom(int argc, char *argv[])
{
- if ( argc == 3 )
+ if (argc == 4)
+ gdcm::Debug::DebugOn();
+
+ if ( argc >= 3 )
{
// The test is specified a specific filename, use it instead of looping
// over all images
const std::string reference = argv[2];
return InternalTest( input, reference );
}
- else if ( argc > 3 || argc == 2 )
+ else if ( argc > 4 || argc == 2 )
{
std::cerr << " Usage: " << argv[0]
<< " (no arguments needed)." << std::endl;
std::cout << " step 1: parse the image (as gdcmFile) and call"
<< " IsReadable(). "
<< std::endl;
- std::cout << " step 2: find in GDCM_DATA_ROOT/BaselineDicom/filename.dcm"
- << std::endl
- << " (with format DICOM V3, explicit Value"
- << "Representation)"
- << std::endl;
- std::cout << " step 3a: when image NOT found on step 2, write "
+ std::cout << " step 2: find in GDCM_DATA_ROOT/BaselineDicom/filename.tst"
<< std::endl
- << " GDCM_DATA_ROOT/BaselineDicom/filename.dcm"
+ << " special internal file format containing the"
<< std::endl
- << " (with format DICOM V3, explicit Value"
- << "Representation)"
+ << " caracteristic of the image and the pixel datas "
+ << "(uncompressed). This file is written if it's not found."
<< std::endl;
- std::cout << " step 3b: when image found on step 2, and when IsReadable()"
+ std::cout << " step 3: compare the DICOM image with the reference image"
<< std::endl
- << " compare it (in memory with memcmp) with the"
+ << " (.tst file). The test is made on the caracteristics"
<< std::endl
- << " image we are testing (the one of step 1). "
+ << " of the image and the pixel datas"
<< std::endl << std::endl;
int i = 0;
////// Check for existence of reference baseline directory
std::string baseLineDir = GDCM_DATA_ROOT;
- baseLineDir += "/BaselineDicom/";
+ baseLineDir += "/BaselineDicom";
if( !gdcm::DirList::IsDirectory(baseLineDir) )
{
filename += "/";
filename += gdcmDataImages[i];
+ baseLineDir += '/';
std::string referenceFileName = baseLineDir + gdcmDataImages[i++];
std::string::size_type slash_pos = referenceFileName.rfind( "." );
if( slash_pos != std::string::npos )