Program: gdcm
Module: $RCSfile: ReWriteExtended.cxx,v $
Language: C++
- Date: $Date: 2006/03/17 14:40:47 $
- Version: $Revision: 1.1 $
+ Date: $Date: 2007/07/13 08:17:20 $
+ Version: $Revision: 1.6 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See Doc/License.txt or
{
START_USAGE(usage)
" \n ReWriteExtended :\n",
- " Re write a full gdcm-readable Dicom image ",
- " (usefull when the file header is not very straight). ",
+ " Re write a full gdcm-readable Dicom image using new features ",
+ " (DO NOT use right now; checking no achieved !). ",
" ",
" usage: ReWriteExtended filein=inputFileName fileout=outputFileName ",
" filecontent = 1 : USER_OWN_IMAGE ",
" noshadow : user doesn't want to load Private groups (odd number)",
" noseq : user doesn't want to load Sequences ",
" rgb : user wants to transform LUT (if any) to RGB pixels ",
- " debug : user wants to run the program in 'debug mode' ",
+ " warning : developper wants to run the program in 'warning mode'",
+ " debug : developper wants to run the program in 'debug mode' ",
FINISH_USAGE
// ----- Initialize Arguments Manager ------
- gdcm::ArgMgr *am = new gdcm::ArgMgr(argc, argv);
+ GDCM_NAME_SPACE::ArgMgr *am = new GDCM_NAME_SPACE::ArgMgr(argc, argv);
if (argc == 1 || am->ArgMgrDefined("usage"))
{
const char *mode = am->ArgMgrGetString("mode","X");
- int filecontent = am->ArgMgrGetInt("filecontent", gdcm::UNMODIFIED_PIXELS_IMAGE);
+ int filecontent = am->ArgMgrGetInt("filecontent", GDCM_NAME_SPACE::UNMODIFIED_PIXELS_IMAGE);
- int loadMode = gdcm::LD_ALL;
+ int loadMode = GDCM_NAME_SPACE::LD_ALL;
if ( am->ArgMgrDefined("noshadowseq") )
- loadMode |= gdcm::LD_NOSHADOWSEQ;
+ loadMode |= GDCM_NAME_SPACE::LD_NOSHADOWSEQ;
else
{
if ( am->ArgMgrDefined("noshadow") )
- loadMode |= gdcm::LD_NOSHADOW;
+ loadMode |= GDCM_NAME_SPACE::LD_NOSHADOW;
if ( am->ArgMgrDefined("noseq") )
- loadMode |= gdcm::LD_NOSEQ;
+ loadMode |= GDCM_NAME_SPACE::LD_NOSEQ;
}
bool rgb = ( 0 != am->ArgMgrDefined("RGB") );
if (am->ArgMgrDefined("debug"))
- gdcm::Debug::DebugOn();
+ GDCM_NAME_SPACE::Debug::DebugOn();
+ if (am->ArgMgrDefined("warning"))
+ GDCM_NAME_SPACE::Debug::WarningOn();
+
+ bool fail = false;
+
+ int *boundRoiVal;
+ bool roi = false;
+ if (am->ArgMgrDefined("roi"))
+ {
+ int nbRoiBound;
+ boundRoiVal = am->ArgMgrGetListOfInt("roi", &nbRoiBound);
+
+ if (nbRoiBound !=4)
+ {
+ std::cout << "Illegal number of 'ROI' boundary values (expected : 4, found:"
+ << nbRoiBound << "); 'ROI' ignored" << std::endl;
+ fail = true;
+ }
+ else
+ roi = true;
+ }
+
+ int beg = am->ArgMgrGetInt("firstFrame",-1);
+ int end = am->ArgMgrGetInt("lastFrame",-1);
+
// if unused Params we give up
if ( am->ArgMgrPrintUnusedLabels() )
{
// ----------- End Arguments Manager ---------
- gdcm::File *f = gdcm::File::New();
+ GDCM_NAME_SPACE::File *f = GDCM_NAME_SPACE::File::New();
f->SetLoadMode( loadMode );
f->SetFileName( fileName );
bool res = f->Load();
return 0;
}
- gdcm::FileHelper *fh = gdcm::FileHelper::New(f);
- void *imageData;
- int dataSize;
-
- if (rgb)
- {
- dataSize = fh->GetImageDataSize();
- imageData = fh->GetImageData(); // somewhat important... can't remember
- fh->SetWriteModeToRGB();
- }
- else
- {
- dataSize = fh->GetImageDataRawSize();
- imageData = fh->GetImageDataRaw();// somewhat important... can't remember
- fh->SetWriteModeToRaw();
- }
-
- if ( imageData == 0 ) // to avoid warning
- {
- std::cout << "Was unable to read pixels " << std::endl;
- }
- std::cout <<std::endl <<" dataSize " << dataSize << std::endl;
+ //std::cout <<std::endl <<" dataSize " << dataSize << std::endl;
int nX,nY,nZ,sPP,planarConfig;
std::string pixelType, transferSyntaxName;
nX=f->GetXSize();
transferSyntaxName = f->GetTransferSyntaxName();
std::cout << " TransferSyntaxName= [" << transferSyntaxName << "]"
<< std::endl;
+
+ GDCM_NAME_SPACE::FileHelper *fh = GDCM_NAME_SPACE::FileHelper::New(f);
+ void *imageData;
+ int dataSize;
+
+ int subImDimX = nX;
+ int subImDimY = nY;
+
+ if (roi)
+ {
+ std::cout << " " << boundRoiVal[0] << " " << boundRoiVal[1] << " " << boundRoiVal[2] << " " <<
+ boundRoiVal[3] <<std::endl;
+ if (boundRoiVal[0]<0 || boundRoiVal[0]>=nX)
+ {
+ std::cout << "xBegin out of bounds; 'roi' ignored" << std::endl;
+ fail = true;
+ }
+ if (boundRoiVal[1]<0 || boundRoiVal[1]>=nX)
+ {
+ std::cout << "xEnd out of bounds; 'roi' ignored" << std::endl;
+ fail = true;
+ }
+ if (boundRoiVal[0] > boundRoiVal[1])
+ {
+ std::cout << "xBegin greater than xEnd; 'roi' ignored" << std::endl;
+ fail = true;
+ }
+
+ if (boundRoiVal[2]<0 || boundRoiVal[2]>=nY)
+ {
+ std::cout << "yBegin out of bounds; 'roi' ignored" << std::endl;
+ fail = true;
+ }
+ if (boundRoiVal[3]<0 || boundRoiVal[3]>=nY)
+ {
+ std::cout << "yEnd out of bounds; 'roi' ignored" << std::endl;
+ fail = true;
+ }
+ if (boundRoiVal[2] > boundRoiVal[3])
+ {
+ std::cout << "yBegin greater than yEnd; 'roi' ignored" << std::endl;
+ fail = true;
+ }
+ }
+ else
+ {
+
+ boundRoiVal = new int[4];
+ boundRoiVal[0] = 0;
+ boundRoiVal[1] = nX-1;
+ boundRoiVal[2] = 0;
+ boundRoiVal[3] = nY-1;
+ }
+
+ subImDimX = boundRoiVal[1]-boundRoiVal[0]+1;
+ subImDimY = boundRoiVal[3]-boundRoiVal[2]+1;
+
+ // =======================================================================
+ if (rgb)
+ {
+ dataSize = fh->GetImageDataSize();
+ imageData = fh->GetImageData(); // somewhat important... can't remember
+ fh->SetWriteModeToRGB();
+ }
+ else
+ {
+ dataSize = fh->GetImageDataRawSize();
+ imageData = fh->GetImageDataRaw();// somewhat important... can't remember
+ fh->SetWriteModeToRaw();
+ }
+
+ if ( imageData == 0 ) // to avoid warning
+ {
+ std::cout << "Was unable to read pixels " << std::endl;
+ }
// We trust user. (just an example; *never* trust an user !)
- fh->SetContentType((gdcm::ImageContentType)filecontent);
+ fh->SetContentType((GDCM_NAME_SPACE::ImageContentType)filecontent);
/// \todo Here, give the detail of operations a 'decent' user should perform,
/// according to what *he* wants to do.
-
// an user shouldn't add images to a 'native' serie.
// He is allowed to create his own Serie, within a 'native' Study :
- // if he wants to do so, he has to call gdcm::Util::GetUniqueUID
+ // if he wants to do so, he has to call GDCM_NAME_SPACE::Util::GetUniqueUID
// only once for a given image set, belonging to a single 'user Serie'
std::string SerieInstanceUID;
switch(filecontent)
{
- case gdcm::USER_OWN_IMAGE :
- SerieInstanceUID = gdcm::Util::CreateUniqueUID();
+ case GDCM_NAME_SPACE::USER_OWN_IMAGE :
+ SerieInstanceUID = GDCM_NAME_SPACE::Util::CreateUniqueUID();
f->SetEntryString(SerieInstanceUID,0x0020,0x000e);
break;
- case gdcm::FILTERED_IMAGE :
+ case GDCM_NAME_SPACE::FILTERED_IMAGE :
/// \todo : to be finished!
break;
- case gdcm::CREATED_IMAGE :
+ case GDCM_NAME_SPACE::CREATED_IMAGE :
/// \todo : to be finished!
break;
- case gdcm::UNMODIFIED_PIXELS_IMAGE :
+ case GDCM_NAME_SPACE::UNMODIFIED_PIXELS_IMAGE :
/// \todo : to be finished!
break;
}
fh->Delete();
return 0;
}
-