]> Creatis software - gdcm.git/blob - Example/Volume2Dicom.cxx
* Some classes inherit now from gdcm::RefCounter
[gdcm.git] / Example / Volume2Dicom.cxx
1 /*=========================================================================
2                                                                                  
3   Program:   gdcm
4   Module:    $RCSfile: Volume2Dicom.cxx,v $
5   Language:  C++
6   Date:      $Date: 2005/10/25 14:52:27 $
7   Version:   $Revision: 1.10 $
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
19 /**
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
24  */
25
26 #include "gdcmFile.h"
27 #include "gdcmDocEntry.h"
28 #include "gdcmFileHelper.h"
29 #include "gdcmUtil.h"
30
31 #define USAGE "USAGE: Input3DImage OutputDirectory"
32
33 #include <time.h>
34 #include <sys/types.h>
35 #include <sys/stat.h>
36 #ifdef WIN32
37    #define stat _stat
38 #endif
39
40 //const unsigned int Dimension = 3;
41
42 void gdcmwrite(const char *inputfile, std::string directory);
43 void GetFileDateAndTime(const char *inputfile, 
44                         std::string &date, std::string &time);
45
46 int main( int argc, char *argv[] )
47 {
48    if (argc < 2) 
49    {
50       std::cerr << argv[0] << USAGE << std::endl;
51       return 1;
52    }    
53
54    //const char *inputfile = argv[1];
55    std::string directory = argv[1];
56    //   itksys::SystemTools::ConvertToUnixSlashes( directory );
57    if (directory[directory.size()-1] != '/') 
58    directory += '/';
59
60    std::cout << "Converting image into dicom in " << directory << std::endl;
61
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;
70
71    int   sizex      = 256;
72    int   sizey      = 256;
73    int   sizez      = 10;
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);
77
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++) 
83    {
84       uint8_t val = imageData[i];
85       if (val > max) 
86          max = val;
87       if (val < min) 
88          min = val;
89    }
90    //float wcenter = (max+min) / 2.;
91    //float wwidth  = (max-min)>0 ? (max-min) : 1.;
92
93    ////////////////////////////////////////////////////////////
94    // Get file date and time                                 //
95    ////////////////////////////////////////////////////////////
96    std::string filedate, filetime;    
97    //GetFileDateAndTime(inputfile, filedate, filetime);
98
99    ////////////////////////////////////////////////////////////
100    // Create a new dicom header and fill in some info        //
101    ////////////////////////////////////////////////////////////
102    gdcm::File *f = gdcm::File::New();
103
104    ////////////////////////////////////////////////////////////
105    // Create a new dicom file object from the header         //
106    ////////////////////////////////////////////////////////////
107    gdcm::FileHelper  *fh = gdcm::FileHelper::New(f);
108    uint8_t *myData = fh->GetImageData(); // Get an Image pointer
109    fh->SetImageData( myData, sliceSize); // This callback ensures that the internal
110                                         // Pixel_Data of fh is set correctly
111
112
113    ////////////////////////////////////////////////////////////
114    // Iterate through the slices and save them to file       //
115    ////////////////////////////////////////////////////////////
116    for (int z=0; z<sizez; z++) 
117    {
118       // Set dicom relevant information for that slice
119       //f->SetImageUIDFromSliceNumber(z);
120       //f->SetImageLocation(orig[0],orig[1],orig[2]+z*spacing[2]);
121
122       // copy image slice content
123       memcpy(myData,imageData+z*sizex*sizey,sliceSize);
124
125       // write the image
126       std::string filename = directory + gdcm::Util::Format("%Image_%05d.dcm", z);
127       std::cout << "Writing file " << filename;
128       fh->WriteDcmExplVR(filename);
129       std::cout << " OK" << std::endl;
130    }
131
132    ////////////////////////////////////////////////////////////
133    // Free the allocated objects                             //
134    ////////////////////////////////////////////////////////////
135    fh->Delete();
136    f->Delete();
137
138    return 0;
139 }
140
141
142 // just an utility function to retrieve date and time of a file
143 void GetFileDateAndTime(const char *inputfile, std::string &date, 
144                                                std::string &time)
145 {
146    struct stat buf;    
147    if (stat(inputfile, &buf) == 0) 
148    {
149       char tmp[512];
150
151       strftime(tmp,512,"%Y%m%d", localtime(&buf.st_mtime) );
152       date = tmp;
153
154       strftime(tmp,512,"%H%M%S", localtime(&buf.st_mtime) );
155       time = tmp;
156    }
157    else
158    {
159       date = "20040101";
160       time = "120000";
161    }
162 }