#include "gdcmImageChangeTransferSyntax.h"
#include "gdcmImageReader.h"
#include "gdcmImageWriter.h"
#include "gdcmFilename.h"
#include "gdcmSystem.h"
#include "gdcmFileMetaInformation.h"
#include "gdcmTesting.h"
#include "gdcmByteSwap.h"
#include "gdcmImageChangePlanarConfiguration.h"
namespace gdcm
{
int TestImageChangeTransferSyntaxJPEGLS(const char *filename, bool verbose = false)
{
ImageReader reader;
reader.SetFileName( filename );
if ( !reader.Read() )
{
const FileMetaInformation &header = reader.GetFile().GetHeader();
MediaStorage ms = header.GetMediaStorage();
bool isImage = MediaStorage::IsImage( ms );
bool pixeldata = reader.GetFile().GetDataSet().FindDataElement( Tag(0x7fe0,0x0010) );
if( isImage && pixeldata )
{
std::cerr << "Failed to read: " << filename << std::endl;
return 1;
}
else
{
std::cerr << "Problem with: " << filename << " but that's ok" << std::endl;
return 0;
}
}
const gdcm::Image &image = reader.GetImage();
int pc = image.GetPlanarConfiguration();
gdcm::ImageChangeTransferSyntax change;
change.SetTransferSyntax( gdcm::TransferSyntax::JPEGLSLossless );
change.SetInput( image );
bool b = change.Change();
if( !b )
{
std::cerr << "Could not change the Transfer Syntax: " << filename << std::endl;
return 1;
}
const char subdir[] = "TestImageChangeTransferSyntax5";
std::string tmpdir = Testing::GetTempDirectory( subdir );
if( !System::FileIsDirectory( tmpdir.c_str() ) )
{
System::MakeDirectory( tmpdir.c_str() );
}
std::string outfilename = Testing::GetTempFilename( filename, subdir );
ImageWriter writer;
writer.SetFileName( outfilename.c_str() );
writer.SetFile( reader.GetFile() ); writer.SetImage( change.GetOutput() );
if( !writer.Write() )
{
std::cerr << "Failed to write: " << outfilename << std::endl;
return 1;
}
ImageReader reader2;
reader2.SetFileName( outfilename.c_str() );
if ( !reader2.Read() )
{
std::cerr << "Could not even reread our generated file : " << outfilename << std::endl;
return 1;
}
int res = 0;
gdcm::Image img = reader2.GetImage();
if( (int)img.GetPlanarConfiguration() != pc )
{
gdcm::ImageChangePlanarConfiguration icpc;
icpc.SetInput( reader2.GetImage() );
icpc.SetPlanarConfiguration( pc );
icpc.Change();
img = icpc.GetOutput();
}
unsigned long len = img.GetBufferLength();
char* buffer = new char[len];
bool res2 = img.GetBuffer(buffer);
if( !res2 )
{
std::cerr << "could not get buffer: " << outfilename << std::endl;
return 1;
}
#ifdef GDCM_WORDS_BIGENDIAN
if( img.GetPixelFormat().GetBitsAllocated() == 16 )
{
gdcm_assert( !(len % 2) );
gdcm_assert( img.GetPhotometricInterpretation() == gdcm::PhotometricInterpretation::MONOCHROME1
|| img.GetPhotometricInterpretation() == gdcm::PhotometricInterpretation::MONOCHROME2 );
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( !ref )
{
std::cerr << "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(res)
{
std::cerr << "problem with: " << outfilename << std::endl;
}
if( verbose )
{
std::cout << "file was written in: " << outfilename << std::endl;
}
delete[] buffer;
return res;
}
}
int TestImageChangeTransferSyntax5(int argc, char *argv[])
{
if( argc == 2 )
{
const char *filename = argv[1];
return gdcm::TestImageChangeTransferSyntaxJPEGLS(filename, true);
}
gdcm::Trace::DebugOff();
gdcm::Trace::WarningOff();
int r = 0, i = 0;
const char *filename;
const char * const *filenames = gdcm::Testing::GetFileNames();
while( (filename = filenames[i]) )
{
r += gdcm::TestImageChangeTransferSyntaxJPEGLS( filename );
++i;
}
return r;
}