#include "gdcmImageReader.h"
#include "gdcmFileMetaInformation.h"
#include "gdcmSystem.h"
#include "gdcmFilename.h"
#include "gdcmByteSwap.h"
#include "gdcmTrace.h"
#include "gdcmTesting.h"
int TestImageRead(const char* filename, bool verbose = false, bool lossydump = false)
{
if( verbose )
std::cerr << "Reading: " << filename << std::endl;
gdcm::ImageReader reader;
reader.SetFileName( filename );
if ( reader.Read() )
{
int res = 0;
const gdcm::Image &img = reader.GetImage();
unsigned long len = img.GetBufferLength();
if ( lossydump )
{
int lossy = img.IsLossy();
std::cout << lossy << "," << filename << std::endl;
}
int reflossy = gdcm::Testing::GetLossyFlagFromFile( filename );
if( reflossy == -1 )
{
std::cerr << "Missing lossy flag for: " << filename << std::endl;
return 1;
}
if( img.IsLossy() != (reflossy > 0 ? true : false) ) {
std::cerr << "Inconsistency for lossy flag for: " << filename << std::endl;
return 1;
}
char* buffer = new char[len];
bool res2 = img.GetBuffer(buffer);
if( !res2 )
{
std::cerr << "res2 failure: " << filename << std::endl;
return 1;
}
#ifdef GDCM_WORDS_BIGENDIAN
if( img.GetPixelFormat().GetBitsAllocated() == 16 )
{
gdcm_assert( !(len % 2) );
gdcm::ByteSwap<unsigned short>::SwapRangeFromSwapCodeIntoSystem(
(unsigned short*)buffer, gdcm::SwapCode::LittleEndian, len/2);
}
#endif
const char *ref = gdcm::Testing::GetMD5FromFile(filename);
char digest[33];
gdcm::Testing::ComputeMD5(buffer, len, digest);
if( verbose )
{
std::cout << "ref=" << ref << std::endl;
std::cout << "md5=" << digest << std::endl;
}
if( !ref )
{
std::cout << "Missing md5 " << digest << " for: " << filename << std::endl;
res = 1;
}
else if( strcmp(digest, ref) != 0 )
{
std::cerr << "Problem reading image from: " << filename << std::endl;
std::cerr << "Found " << digest << " instead of " << ref << std::endl;
res = 1;
#if 0#endif
}
delete[] buffer;
return res;
}
const gdcm::FileMetaInformation &header = reader.GetFile().GetHeader();
gdcm::MediaStorage ms = header.GetMediaStorage();
bool isImage = gdcm::MediaStorage::IsImage( ms );
if( isImage )
{
if( reader.GetFile().GetDataSet().FindDataElement( gdcm::Tag(0x7fe0,0x0010) ) )
{
std::cerr << "Failed to read image from file: " << filename << std::endl;
return 1;
}
else
{
std::cerr << "no Pixel Data Element found in the file:" << filename << std::endl;
return 0;
}
}
std::cerr << "Could not read image(" << filename << "), since file is a: " << ms << std::endl;
return 0;
}
int TestImageReader(int argc, char *argv[])
{
if( argc == 2 )
{
const char *filename = argv[1];
return TestImageRead(filename, true);
}
gdcm::Trace::DebugOff();
gdcm::Trace::WarningOff();
gdcm::Trace::ErrorOff();
int r = 0, i = 0;
const char *filename;
const char * const *filenames = gdcm::Testing::GetFileNames();
while( (filename = filenames[i]) )
{
r += TestImageRead( filename);
++i;
}
return r;
}