1 /*=========================================================================
4 Module: $RCSfile: AnonymizeNoLoad.cxx,v $
6 Date: $Date: 2007/06/06 13:03:57 $
7 Version: $Revision: 1.21 $
9 Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
10 l'Image). All rights reserved. See Doc/License.txt or
11 http://www.creatis.insa-lyon.fr/Public/Gdcm/License.html for details.
13 This software is distributed WITHOUT ANY WARRANTY; without even
14 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 PURPOSE. See the above copyright notices for more information.
17 =========================================================================*/
19 #include "gdcmFileHelper.h"
20 #include "gdcmCommon.h"
21 #include "gdcmDebug.h"
22 #include "gdcmDirList.h"
24 #include "gdcmArgMgr.h"
28 int main(int argc, char *argv[])
31 "\n AnonymizeNoLoad :\n ",
32 "Anonymize a gdcm-parsable Dicom image even if pixels aren't gdcm readable ",
33 " Warning : the image is OVERWRITTEN ",
34 " to preserve image integrity, use a copy. ",
35 "usage: AnonymizeNoLoad {filein=inputFileName|dirin=inputDirectoryName} ",
36 " [rubout=listOfElementsToRubOut] ",
37 " [ { [noshadowseq] | [noshadow][noseq] } ] [debug] ",
38 " inputFileName : Name of the (single) file user wants to anonymize ",
39 " inputDirectoryName : user wants to anonymize *all* the files ",
40 " within the (single Patient!) directory ",
41 " listOfElementsToRubOut : group-elem,g2-e2,... (in hexa, no space) ",
42 " of extra Elements to rub out ",
43 " noshadowseq: user doesn't want to load Private Sequences ",
44 " noshadow : user doesn't want to load Private groups (odd number) ",
45 " noseq : user doesn't want to load Sequences ",
46 " debug : developper wants to run the program in 'debug mode' ",
49 // ----- Initialize Arguments Manager ------
51 GDCM_NAME_SPACE::ArgMgr *am = new GDCM_NAME_SPACE::ArgMgr(argc, argv);
53 if (am->ArgMgrDefined("usage") || argc == 1)
55 am->ArgMgrUsage(usage); // Display 'usage'
60 if (am->ArgMgrDefined("debug"))
61 GDCM_NAME_SPACE::Debug::DebugOn();
63 const char *fileName = am->ArgMgrGetString("filein");
64 const char *dirName = am->ArgMgrGetString("dirin");
66 if ( (fileName == 0 && dirName == 0)
68 (fileName != 0 && dirName != 0) )
71 << "Either 'filein=' or 'dirin=' must be present;"
72 << std::endl << "Not both" << std::endl;
73 am->ArgMgrUsage(usage); // Display 'usage'
78 int loadMode = GDCM_NAME_SPACE::LD_ALL;
79 if ( am->ArgMgrDefined("noshadowseq") )
80 loadMode |= GDCM_NAME_SPACE::LD_NOSHADOWSEQ;
83 if ( am->ArgMgrDefined("noshadow") )
84 loadMode |= GDCM_NAME_SPACE::LD_NOSHADOW;
85 if ( am->ArgMgrDefined("noseq") )
86 loadMode |= GDCM_NAME_SPACE::LD_NOSEQ;
90 uint16_t *elemsToRubOut = am->ArgMgrGetXInt16Enum("rubout", &rubOutNb);
92 /* if unused Param we give up */
93 if ( am->ArgMgrPrintUnusedLabels() )
95 am->ArgMgrUsage(usage);
100 delete am; // ------ we don't need Arguments Manager any longer ------
102 GDCM_NAME_SPACE::File *f;
103 if ( fileName != 0 ) // ====== Deal with a single file ======
107 // Parse the input file.
109 f = GDCM_NAME_SPACE::File::New( );
110 f->SetLoadMode(loadMode);
111 f->SetFileName( fileName );
113 // GDCM_NAME_SPACE::File::IsReadable() is no usable here, because we deal with
114 // any kind of GDCM_NAME_SPACE::Readable *document*
115 // not only GDCM_NAME_SPACE::File (as opposed to GDCM_NAME_SPACE::DicomDir)
118 std::cout <<std::endl
119 << "Sorry, " << fileName <<" not a gdcm-readable "
120 << "DICOM / ACR Document"
125 std::cout << fileName << " is readable " << std::endl;
128 // No need to load the pixels in memory.
129 // File will be overwritten
133 // Choose the fields to anonymize.
137 f->AddAnonymizeElement( 0x0008, 0x0080, "gdcm-Xanadoo Hospital" );
139 f->AddAnonymizeElement( 0x0010, 0x0010, "gdcm^Fantomas" );
141 f->AddAnonymizeElement( 0x0010, 0x0020,"1515" );
142 // Patient's Birthdate
143 f->AddAnonymizeElement( 0x0010, 0x0030,"11111111" );
145 f->AddAnonymizeElement( 0x0010, 0x1040,"gdcm at Sing-sing.org" );
146 // Patient's Mother's Birth Name
147 f->AddAnonymizeElement( 0x0010, 0x1060,"gdcm^Vampirella" );
148 // Study Instance UID
149 f->AddAnonymizeElement( 0x0020, 0x000d, "9.99.999.9999" );
151 f->AddAnonymizeElement(0x0010, 0x2154, "3615" );
153 for (int ri=0; ri<rubOutNb; ri++)
155 printf("%04x,%04x\n",elemsToRubOut[2*ri], elemsToRubOut[2*ri+1]);
156 f->AddAnonymizeElement((uint32_t)elemsToRubOut[2*ri],
157 (uint32_t)elemsToRubOut[2*ri+1],"*" );
160 // Aware use will add new fields here
163 // Overwrite the file
166 std::cout <<"Let's AnonymizeNoLoad " << std::endl;
168 // The GDCM_NAME_SPACE::File remains untouched in memory
170 f->AnonymizeNoLoad();
172 // No need to write the file : modif were done on disc !
173 // ( The Dicom file is overwritten )
174 std::cout <<"End AnonymizeNoLoad" << std::endl;
177 // Remove the Anonymize list
179 f->ClearAnonymizeList();
185 else // ====== Deal with a (single Patient) Directory ======
187 std::cout << "dirName [" << dirName << "]" << std::endl;
188 GDCM_NAME_SPACE::DirList dirList(dirName,1); // gets recursively the file list
189 GDCM_NAME_SPACE::DirListType fileList = dirList.GetFilenames();
190 for( GDCM_NAME_SPACE::DirListType::iterator it = fileList.begin();
191 it != fileList.end();
194 f = GDCM_NAME_SPACE::File::New( );
195 f->SetLoadMode(loadMode);
196 f->SetFileName( it->c_str() );
204 // Choose the fields to anonymize.
208 f->AddAnonymizeElement( 0x0008, 0x0080, "gdcm-Xanadoo Hospital" );
210 f->AddAnonymizeElement( 0x0010, 0x0010, "gdcm^Fantomas" );
212 f->AddAnonymizeElement( 0x0010, 0x0020,"1515" );
213 // Patient's Birthdate
214 f->AddAnonymizeElement( 0x0010, 0x0030,"11111111" );
216 f->AddAnonymizeElement( 0x0010, 0x1040,"gdcm at Sing-sing.org" );
217 // Patient's Mother's Birth Name
218 f->AddAnonymizeElement( 0x0010, 0x1060,"gdcm^Vampirella" );
219 // Study Instance UID
220 // we may not brutaly overwrite it
221 //f->AddAnonymizeElement( 0x0020, 0x000d, "9.99.999.9999" );
223 f->AddAnonymizeElement(0x0010, 0x2154, "3615" );
225 // deal with user defined Elements set
227 for (int ri=0; ri<rubOutNb; ri++)
229 f->AddAnonymizeElement((uint32_t)elemsToRubOut[2*ri],
230 (uint32_t)elemsToRubOut[2*ri+1],"*" );
232 std::cout <<"Let's AnonymizeNoLoad " << it->c_str() << std::endl;
234 // The GDCM_NAME_SPACE::File remains untouched in memory
235 // The Dicom file is overwritten on disc
237 f->AnonymizeNoLoad();
240 // Remove the Anonymize list
243 f->ClearAnonymizeList();