1 /*=========================================================================
4 Module: $RCSfile: Volume2Dicom.cxx,v $
6 Date: $Date: 2004/12/06 11:37:37 $
7 Version: $Revision: 1.3 $
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 =========================================================================*/
20 * This example was proposed by Jean-Michel Rouet
21 * It was patch by Mathieu Malaterre to remove ITK reference and be more
22 * independant from other toolkit
23 * It's aim is to show people how to write their data volume into DICOM slices
26 #include "gdcmHeader.h"
27 #include "gdcmDocEntry.h"
28 #include "gdcmBinEntry.h"
32 #define USAGE "USAGE: Input3DImage OutputDirectory"
35 #include <sys/types.h>
41 const unsigned int Dimension = 3;
43 void gdcmwrite(const char *inputfile, std::string directory);
44 void GetFileDateAndTime(const char *inputfile, std::string &date, std::string &time);
46 int main( int argc, char * argv[] )
50 std::cerr << argv[0] << USAGE << std::endl;
54 //const char *inputfile = argv[1];
55 std::string directory = argv[1];
56 // itksys::SystemTools::ConvertToUnixSlashes( directory );
57 if (directory[directory.size()-1] != '/')
60 std::cout << "Converting image into dicom in " << directory << std::endl;
62 ////////////////////////////////////////////////////////////
63 // Reading input image and getting some information //
64 ////////////////////////////////////////////////////////////
65 //std::cout << "Loading image " << inputfile << std::endl;
66 //PixelType* imageData = input->GetPixelContainer()->GetImportPointer();
67 uint8_t *imageData = new uint8_t[256*256*10];
68 memset( imageData, 0, 256*256*10);
69 std::cout << "Image Loaded." << std::endl;
74 //float spacing[3] = { 1.0, 1.0, 1.5 };
75 //float orig[3] = { 0.0, 0.0, 0.0 };
76 int sliceSize = sizex*sizey*sizeof(uint8_t);
78 ////////////////////////////////////////////////////////////
79 // compute window center and window width //
80 ////////////////////////////////////////////////////////////
81 uint8_t min, max; min = max = imageData[0];
82 for (int i=1; i<sizex*sizey*sizez; i++)
84 uint8_t val = imageData[i];
90 //float wcenter = (max+min) / 2.;
91 //float wwidth = (max-min)>0 ? (max-min) : 1.;
93 ////////////////////////////////////////////////////////////
94 // Get file date and time //
95 ////////////////////////////////////////////////////////////
96 std::string filedate, filetime;
97 //GetFileDateAndTime(inputfile, filedate, filetime);
99 ////////////////////////////////////////////////////////////
100 // Create a new dicom header and fill in some info //
101 ////////////////////////////////////////////////////////////
102 gdcm::Header *h1 = new gdcm::Header();
104 //h1->SetDateAndTime(filedate, filetime);
105 //h1->SetModality("CT");
106 //h1->SetPatientName( "TestPatient");
107 //h1->SetPatientID( "TestID");
108 //h1->SetStudyID( "1");
109 //h1->SetSeriesNumber( "1");
110 //h1->SetSliceThickness(spacing[2]);
111 //h1->SetSpaceBetweenSlices(spacing[2]);
112 //h1->SetXYSpacing( spacing[0], spacing[1]);
113 //h1->SetXSize(sizex);
114 //h1->SetYSize(sizey);
115 //h1->SetNbBitsAllocated(16);
116 //h1->SetNbBitsStored(12);
117 //h1->SetNbBitsStored(12);
118 //h1->SetPixelSigned(true);
119 //h1->SetCenter( wcenter);
120 //h1->SetWindow( wwidth);
122 ////////////////////////////////////////////////////////////
123 // Create a new dicom file object from the header //
124 ////////////////////////////////////////////////////////////
125 gdcm::File *f1 = new gdcm::File(h1);
126 uint8_t *myData = f1->GetImageData(); // Get an Image pointer
127 f1->SetImageData( myData, sliceSize); // This callback ensures that the internal
128 // Pixel_Data of f1 is set correctly
131 ////////////////////////////////////////////////////////////
132 // Iterate through the slices and save them to file //
133 ////////////////////////////////////////////////////////////
134 for (int z=0; z<sizez; z++)
136 // Set dicom relevant information for that slice
137 //h1->SetImageUIDFromSliceNumber(z);
138 //h1->SetImageLocation(orig[0],orig[1],orig[2]+z*spacing[2]);
140 // copy image slice content
141 memcpy(myData,imageData+z*sizex*sizey,sliceSize);
144 std::string filename = directory + gdcm::Util::Format("%Image_%05d.dcm", z);
145 std::cout << "Writing file " << filename;
146 f1->WriteDcmExplVR(filename);
147 std::cout << " OK" << std::endl;
150 ////////////////////////////////////////////////////////////
151 // Free the allocated objects //
152 ////////////////////////////////////////////////////////////
153 // delete f1; // FIXME: these calls sometimes crashes under .NET ????
160 // just an utility function to retrieve date and time of a file
161 void GetFileDateAndTime(const char *inputfile, std::string &date, std::string &time)
164 if (stat(inputfile, &buf) == 0)
168 strftime(tmp,512,"%Y%m%d", localtime(&buf.st_mtime) );
171 strftime(tmp,512,"%H%M%S", localtime(&buf.st_mtime) );