2 #include "gdcmFileHelper.h"
3 #include "gdcmCommon.h"
5 #include "gdcmDataEntry.h"
7 #include "gdcmArgMgr.h"
10 // Each BIT of Overlay Data (0x6000,0x3000) corresponds
11 // to a BYTE of overlay image.
12 void explodeByte(unsigned char byte, unsigned char* result)
14 unsigned char mask = 1;
27 int main(int argc, char *argv[])
30 " \n exOverlaysDCM :\n ",
31 " Extract an overlay image from a DICOM image ",
32 " Warning : probably segfaults if no overlay ",
33 " usage: exOverlaysDCM filein=inputFileName fileout=outputFileName [debug] ",
34 " debug : developper wants to run the program in 'debug mode' ",
37 // ----- Initialize Arguments Manager ------
38 GDCM_NAME_SPACE::ArgMgr *am = new GDCM_NAME_SPACE::ArgMgr(argc, argv);
40 if (argc == 1 || am->ArgMgrDefined("usage"))
42 am->ArgMgrUsage(usage); // Display 'usage'
48 char *fileName = am->ArgMgrWantString("filein",usage);
49 if ( fileName == NULL )
57 const char *fileName = am->ArgMgrGetString("filein");
58 const char *dirName = am->ArgMgrGetString("dirin");
60 if ( (fileName == 0 && dirName == 0) ||
61 (fileName != 0 && dirName != 0) )
63 std::cerr << std::endl
64 << "Either 'filein=' or 'dirin=' must be present;"
65 << std::endl << "Not both" << std::endl;
66 am->ArgMgrUsage(usage); // Display 'usage'
72 char *outputFileName = am->ArgMgrWantString("fileout",usage);
73 if ( outputFileName == NULL )
78 if (am->ArgMgrDefined("debug"))
79 GDCM_NAME_SPACE::Debug::DebugOn();
81 if (am->ArgMgrDefined("warning"))
82 GDCM_NAME_SPACE::Debug::WarningOn();
84 // if unused Param we give up
85 if ( am->ArgMgrPrintUnusedLabels() )
87 am->ArgMgrUsage(usage);
92 delete am; // we don't need Argument Manager any longer
94 // ============================================================
95 // Read the input file.
96 // ============================================================
98 GDCM_NAME_SPACE::File *f;
100 f = GDCM_NAME_SPACE::File::New( );
101 f->SetLoadMode( GDCM_NAME_SPACE::LD_ALL );
102 f->SetFileName( fileName );
103 f->AddForceLoadElement(0x6000,0x3000); // Overlay Data
108 std::cerr << "Sorry, " << fileName <<" not a gdcm-readable "
109 << "DICOM / ACR File" <<std::endl;
113 std::cout << " ... is readable " << std::endl;
115 // ============================================================
116 // Load the Overlays in memory (the first one)
117 // ============================================================
119 GDCM_NAME_SPACE::DataEntry *e = f->GetDataEntry(0x6000, 0x3000);
122 std::cout << " Image doesn't contain any Overlay " << std::endl;
126 std::cout << " File is read! " << std::endl;
128 uint8_t *overlay = (uint8_t *)(e->GetBinArea());
131 std::cerr << "Sorry, Overlays of" << fileName <<" are not "
132 << " gdcm-readable." << std::endl;
137 // ============================================================
138 // Image data generation.
139 // ============================================================
142 unsigned int dimX= f->GetXSize();
143 unsigned int dimY= f->GetYSize();
145 unsigned int dimXY=dimX*dimY;
146 std::cout << "DimX : "<< dimX <<" DimY : " << dimY
147 << " DimXY : " <<dimXY << std::endl;
148 unsigned char *outputData = new unsigned char[dimXY];
150 unsigned char *result=outputData;
151 for (unsigned int i=0;i<(dimXY/8);i++)
153 explodeByte(overlay[i], result);
157 // ============================================================
159 // ============================================================
160 GDCM_NAME_SPACE::File *f2;
161 f2 = GDCM_NAME_SPACE::File::New( );
165 sprintf(temp,"%d ",dimX);
166 f2->InsertEntryString(temp,0x0028,0x0011, "US"); // Columns
167 sprintf(temp,"%d ",dimY);
168 f2->InsertEntryString(temp,0x0028,0x0010, "US"); // Rows
170 f2->InsertEntryString("8",0x0028,0x0100, "US"); // Bits Allocated
171 f2->InsertEntryString("8",0x0028,0x0101, "US"); // Bits Stored
172 f2->InsertEntryString("7",0x0028,0x0102, "US"); // High Bit
173 f2->InsertEntryString("0",0x0028,0x0103, "US"); // Pixel Representation
174 f2->InsertEntryString("1",0x0028,0x0002, "US"); // Samples per Pixel
175 f2->InsertEntryString("MONOCHROME2 ",0x0028,0x0004, "LO");
178 // feel free to add any field (Dicom Data Entry) you like, here.
180 GDCM_NAME_SPACE::FileHelper *fh = GDCM_NAME_SPACE::FileHelper::New(f2);
182 fh->SetImageData(outputData,dimXY);
183 fh->WriteDcmExplVR(outputFileName);
184 std::cout <<"End WriteOverlayImage" << std::endl;