]> Creatis software - gdcm.git/blob - Example/ReWrite.cxx
Enhancement of Rewrite (use may choose if he wants LUT or RGB Pixels)
[gdcm.git] / Example / ReWrite.cxx
1 /*=========================================================================
2                                                                                 
3   Program:   gdcm
4   Module:    $RCSfile: ReWrite.cxx,v $
5   Language:  C++
6   Date:      $Date: 2005/06/10 14:10:22 $
7   Version:   $Revision: 1.4 $
8                                                                                 
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.
12                                                                                 
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.
16                                                                                 
17 =========================================================================*/
18 #include "gdcmFile.h"
19 #include "gdcmFileHelper.h"
20 #include "gdcmDebug.h"
21
22 #include "gdcmArgMgr.h"
23
24 #include <iostream>
25
26 int main(int argc, char *argv[])
27 {
28    START_USAGE(usage)
29    " \n ReWrite :\n",
30    " Re write a full gdcm-readable Dicom image                              ",
31    "     (usefull when the file header is not very straight).               ",
32    "",
33    " usage: ReWrite filein=inputFileName fileout=anonymizedFileName         ", 
34    "       [mode=write mode] [noshadow] [noseq][debug]                      ", 
35    "        mode = a (ACR), x (Explicit VR Dicom), r (RAW : only pixels)    ",
36    "        noshadow : user doesn't want to load Private groups (odd number)",
37    "        noseq    : user doesn't want to load Sequences                  ",
38    "        rgb      : user wants to tranform LUT (if any) to RGB pixels    ",
39    "        debug    : user wants to run the program in 'debug mode'        ",
40    FINISH_USAGE
41
42    // ----- Initialize Arguments Manager ------   
43    gdcm::ArgMgr *am = new gdcm::ArgMgr(argc, argv);
44   
45    if (am->ArgMgrDefined("usage")) 
46    {
47       am->ArgMgrUsage(usage); // Display 'usage'
48       delete am;
49       return 0;
50    }
51    char *fileName = am->ArgMgrWantString("filein",usage);
52    if ( fileName == NULL )
53    {
54       delete am;
55       return 0;
56    }
57
58    char *outputFileName = am->ArgMgrWantString("fileout",usage);
59    if ( outputFileName == NULL )
60    {
61       delete am;
62       return 0;
63    }
64
65    char *mode = am->ArgMgrGetString("mode",(char *)"X");
66
67    int loadMode;
68    if ( am->ArgMgrDefined("noshadow") && am->ArgMgrDefined("noseq") )
69        loadMode = NO_SEQ | NO_SHADOW;  
70    else if ( am->ArgMgrDefined("noshadow") )
71       loadMode = NO_SHADOW;
72    else if ( am->ArgMgrDefined("noseq") )
73       loadMode = NO_SEQ;
74    else
75       loadMode = 0;
76
77    bool rgb = am->ArgMgrDefined("RGB");
78
79    if (am->ArgMgrDefined("debug"))
80       gdcm::Debug::DebugOn();
81  
82    // if unused Param we give up
83    if ( am->ArgMgrPrintUnusedLabels() )
84    { 
85       am->ArgMgrUsage(usage);
86       delete am;
87       return 0;
88    }
89
90    delete am;  // we don't need Argument Manager any longer
91
92    // ----------- End Arguments Manager ---------
93
94    gdcm::File *e1 = new gdcm::File();
95    e1->SetLoadMode(loadMode);
96
97    bool res = e1->Load( fileName );
98    if ( !res )
99    {
100       delete e1;
101       delete am;
102       return 0;
103    }
104   
105    if (!e1->IsReadable())
106    {
107        std::cerr << "Sorry, not a Readable DICOM / ACR File"  <<std::endl;
108        delete e1;
109        delete am; 
110        return 0;
111    }
112    
113    gdcm::FileHelper *f1 = new gdcm::FileHelper(e1);
114    void *imageData;
115    int dataSize;
116   
117    if (rgb)
118    {
119       dataSize  = f1->GetImageDataSize();
120       imageData = f1->GetImageData(); // somewhat important... can't remember
121       f1->SetWriteModeToRGB();
122    }
123    else
124    {
125       dataSize  = f1->GetImageDataRawSize();
126       imageData = f1->GetImageDataRaw();
127       f1->SetWriteModeToRaw();
128    }
129
130    std::cout <<std::endl <<" dataSize " << dataSize << std::endl;
131    int nX,nY,nZ,sPP,planarConfig;
132    std::string pixelType, transferSyntaxName;
133    nX=e1->GetXSize();
134    nY=e1->GetYSize();
135    nZ=e1->GetZSize();
136    std::cout << " DIMX=" << nX << " DIMY=" << nY << " DIMZ=" << nZ << std::endl;
137
138    pixelType    = e1->GetPixelType();
139    sPP          = e1->GetSamplesPerPixel();
140    planarConfig = e1->GetPlanarConfiguration();
141    
142    std::cout << " pixelType="           << pixelType 
143              << " SampleserPixel="      << sPP
144              << " PlanarConfiguration=" << planarConfig 
145              << " PhotometricInterpretation=" 
146                                 << e1->GetEntryValue(0x0028,0x0004) 
147              << std::endl;
148
149    int numberOfScalarComponents=e1->GetNumberOfScalarComponents();
150    std::cout << "NumberOfScalarComponents " << numberOfScalarComponents <<std::endl;
151    transferSyntaxName = e1->GetTransferSyntaxName();
152    std::cout << " TransferSyntaxName= [" << transferSyntaxName << "]" << std::endl;
153
154    switch (mode[0])
155    {
156    case 'A' :
157    case 'a' :
158             // Writting an ACR file
159             // from a full gdcm readable File
160
161       std::cout << "WriteACR" << std::endl;
162       f1->WriteAcr(outputFileName);
163       break;
164
165    case 'D' : // Not documented in the 'usage', because the method is known to be bugged. 
166    case 'd' :
167            // Writting a DICOM Implicit VR file
168            // from a full gdcm readable File
169
170       std::cout << "WriteDCM Implicit VR" << std::endl;
171       f1->WriteDcmImplVR(outputFileName);
172       break;
173
174    case 'X' :
175    case 'x' :
176               // writting a DICOM Explicit VR 
177               // from a full gdcm readable File
178
179       std::cout << "WriteDCM Explicit VR" << std::endl;
180       f1->WriteDcmExplVR(outputFileName);
181       break;
182
183    case 'R' :
184    case 'r' :
185              //  Writting a Raw File, 
186
187       std::cout << "WriteRaw" << std::endl;
188       f1->WriteRawData(outputFileName);
189       break;
190
191    }
192    delete e1;
193    delete f1;
194    return 0;
195 }
196