]> Creatis software - creaImageIO.git/blobdiff - src/creaImageIOGimmickView.cpp
allow data anonymization
[creaImageIO.git] / src / creaImageIOGimmickView.cpp
index 2b7c85b1883a8a8e4a5f4c1cafc903c92eab60ec..02d18a7d490af03bb2eab27f1540d000f6b5aea3 100644 (file)
@@ -5,6 +5,8 @@
 #if defined(USE_GDCM)
 #include <gdcmGlobal.h>
 #include <gdcmSerieHelper.h>
+#include <gdcmFileHelper.h>
+#include <gdcmUtil.h>
 #include <vtkGdcmReader.h>
 #endif
 
@@ -28,20 +30,20 @@ namespace creaImageIO
   public:
     ImageExtent(const std::string& x, const std::string& y, const std::string& z, const std::string& t)
        {
-                sscanf(x.c_str(),"%d",&mExtent[0]);
-                sscanf(y.c_str(),"%d",&mExtent[1]);
-                sscanf(z.c_str(),"%d",&mExtent[2]);
-                sscanf(t.c_str(),"%d",&mExtent[3]);
-                if(x==""){mExtent[0]=1;}
-            if(y==""){mExtent[1]=1;}
-            if(z==""){mExtent[2]=1;}
-                if(t==""){mExtent[3]=1;}
-
-                if (mExtent[3]>1) mDim=4;
-                else if (mExtent[2]>1) mDim=3;
-            else if (mExtent[1]>1) mDim=2;
-            else if (mExtent[0]>1) mDim=1;
-                else mDim=0;
+               sscanf(x.c_str(),"%d",&mExtent[0]);
+               sscanf(y.c_str(),"%d",&mExtent[1]);
+               sscanf(z.c_str(),"%d",&mExtent[2]);
+               sscanf(t.c_str(),"%d",&mExtent[3]);
+               if(x==""){mExtent[0]=1;}
+               if(y==""){mExtent[1]=1;}
+               if(z==""){mExtent[2]=1;}
+               if(t==""){mExtent[3]=1;}
+
+               if (mExtent[3]>1) mDim=4;
+               else if (mExtent[2]>1) mDim=3;
+               else if (mExtent[1]>1) mDim=2;
+               else if (mExtent[0]>1) mDim=1;
+               else mDim=0;
        }
        
 
@@ -218,30 +220,11 @@ namespace creaImageIO
        }
        else
        {
-               std::string extentx = (*sel).GetAttribute("D0028_0010");
-               std::string extenty = (*sel).GetAttribute("D0028_0011");
-               std::string extentz = (*sel).GetAttribute("D0028_0012");
-               std::string extentt = (*sel).GetAttribute("D0028_0010");
-               if( extentx == "" && extenty == "" && extentz == "")
-               {
-                       // we try to create a vtkImageData just to get dim informations
-                       // Long method need to improve it!
-                       std::string name = (*sel).GetAttribute("FullFileName");
-                       if (name != "")
-                       {
-                               int dim[3];
-                               char c[5];
-                               mReader.GetImage(name)->GetDimensions(dim);
-                               sprintf(c,"%d", dim[0]);
-                               extentx = c;
-                               sprintf(c,"%d", dim[1]);
-                               extenty = c;
-                               sprintf(c,"%d", dim[2]);
-                               extentz = c;
-                       }
-               }
+                       boost::shared_ptr<ImageExtent> ie=boost::shared_ptr<ImageExtent>(new ImageExtent((*sel).GetAttribute("D0028_0010"),
+                                                                       (*sel).GetAttribute("D0028_0011"),
+                                                                       (*sel).GetAttribute("D0028_0012"), 
+                                                                       ""));
 
-               boost::shared_ptr<ImageExtent> ie=boost::shared_ptr<ImageExtent>(new ImageExtent(extentx, extenty, extentz,extentt));
        if(mImageExtent==0)
        {
                mImageExtent=ie;
@@ -315,11 +298,16 @@ namespace creaImageIO
          mValidationSignal(ivalid);
   }
 
+  void GimmickView::stopReader()
+  {
+         mReader.Stop();
+  }
+
    //======================================================================
   ///Reads Images (Non Threaded)
 void GimmickView::ReadImagesNotThreaded(std::vector<vtkImageData*>& s, std::vector<std::string> im, int dimension)
 {
-       mReader.Stop();
+       stopReader();
 /* remember!
 
 #define GIMMICK_NO_IMAGE_SELECTION 0
@@ -436,7 +424,7 @@ void GimmickView::ReadImagesNotThreaded(std::vector<vtkImageData*>& s, std::vect
                vtkImageData* first = mReader.GetImage( i_file);
                int dim[3];
                first->GetDimensions(dim);
-               if (dim[3] > 1)
+               if (dim[2] > 1)
                {
                        bres = false;
                }
@@ -481,7 +469,7 @@ void GimmickView::ReadImagesNotThreaded(std::vector<vtkImageData*>& s, std::vect
                // If we want only one output information structure, we set it outside the loop
                if(!i_attr.mult)
                {
-                       getAttributes(im.front(), o_output.front().infos,i_attr);
+                       getAttributes(im.front(), o_output.front().infos, i_attr);
                }
                
        }
@@ -509,7 +497,10 @@ void GimmickView::ReadImagesNotThreaded(std::vector<vtkImageData*>& s, std::vect
                }
                out.img->SetExtent(ext);
                int dim[3];
+               double spac[3];
                first->GetDimensions(dim);
+               first->GetSpacing(spac);
+               out.img->SetSpacing(spac);
                out.img->SetDimensions(dim[0], dim[1], im.size() );
                out.img->AllocateScalars();
                out.img->Update();
@@ -542,7 +533,9 @@ void GimmickView::ReadImagesNotThreaded(std::vector<vtkImageData*>& s, std::vect
        {
                vtkImageData* first = mReader.GetImage( im.front());
                int dim[3];
+               double spac[3];
                first->GetDimensions(dim);
+               first->GetSpacing(spac);
                // differents formats char , short, etc...
                // differents components 1..3  ex. jpg ->RGB 3
                unsigned long imsize = dim[0] * dim[1];
@@ -560,7 +553,7 @@ void GimmickView::ReadImagesNotThreaded(std::vector<vtkImageData*>& s, std::vect
                                OutStrGimmick out;
                                out.img = vtkImageData::New();
                                out.img->SetScalarType(first->GetScalarType());
-
+                               out.img->SetSpacing(spac);
                                out.img->SetNumberOfScalarComponents(first->GetNumberOfScalarComponents());
                                int ext[6];
                                first->GetWholeExtent(ext);  // send also 0,0 in Z 
@@ -583,7 +576,7 @@ void GimmickView::ReadImagesNotThreaded(std::vector<vtkImageData*>& s, std::vect
 
        }
 
-               //////////////////////////////////////////////////////////
+       //////////////////////////////////////////////////////////
        // create an output structure with n entries (T size) = T + n output
        //////////////////////////////////////////////////////////
        void GimmickView::readImages4(std::vector<OutStrGimmick>& o_output, std::vector<std::string> im,
@@ -603,10 +596,12 @@ void GimmickView::ReadImagesNotThreaded(std::vector<vtkImageData*>& s, std::vect
                        out.img->SetNumberOfScalarComponents(first->GetNumberOfScalarComponents());
                        
                        int ext[6];
+                       double spac[6];
                        first->GetWholeExtent(ext);  // send also 0,0 in Z 
                        ext[5] = 0;
                        out.img->SetExtent(ext);
-                       
+                       first->GetSpacing(spac);
+                       out.img->SetSpacing(spac);
                        out.img->SetDimensions(dim[0], dim[1], im.size() );
                        out.img->AllocateScalars();
                        out.img->Update();
@@ -704,7 +699,6 @@ void GimmickView::ReadImagesNotThreaded(std::vector<vtkImageData*>& s, std::vect
 
 
 
-
 void GimmickView::ReadImagesNotThreadedInVector(std::vector<vtkImageData*>& s, std::vector<std::string> im, int dimension)
 {
        // Create the output data
@@ -720,6 +714,7 @@ void GimmickView::ReadImagesNotThreadedInVector(std::vector<vtkImageData*>& s, s
        }
        else if (im.size()>1) // Test inutile ? JPR
        {
+               /// \TODO fix unused variable 'first'
                vtkImageData* first = mReader.GetImage( im.front());
                if (dimension == 2)
                {
@@ -846,6 +841,66 @@ void GimmickView::ReadImagesNotThreadedInVector(std::vector<vtkImageData*>& s, s
   
 
 
+////////////////////////////////////////////////////////////////////////
+void GimmickView::Anonymize(std::vector<std::string> i_filenames, int type)
+{
+       bool res = true;
+   std::vector<GDCM_NAME_SPACE::FileHelper *> filesH;
+   std::vector<std::string> suid;
+   std::map<std::string, std::string> msuid;
+   std::string tempuid = GDCM_NAME_SPACE::Util::CreateUniqueUID();
+   int i = 1;
+   std::vector<std::string>::iterator it = i_filenames.begin();
+   for(; it != i_filenames.end(); it++)
+   {
+
+          GDCM_NAME_SPACE::File *file;
+          file = GDCM_NAME_SPACE::File::New(  );
+          file->SetLoadMode( GDCM_NAME_SPACE::LD_ALL );
+          file->SetFileName( (*it).c_str() );
+          res = file->Load();
+          if ( !res ) 
+          {
+                       std::cerr << "Sorry, " <<  (*it).c_str()  <<"  not a gdcm-readable "
+                 << "DICOM / ACR File" <<std::endl;
+                       file ->Delete();
+       //return 0;
+               }
+               std::cout << " ... is readable " << std::endl;
+               
+               // We need a gdcm::FileHelper, since we want to load the pixels        
+               GDCM_NAME_SPACE::FileHelper *fh = GDCM_NAME_SPACE::FileHelper::New(file);
+       
+   uint8_t *imageData = fh->GetImageData();
+
+          // Institution name 
+          file->AddAnonymizeElement(0x0008, 0x0080, "*"); 
+          // Patient's name 
+          file->AddAnonymizeElement(0x0010, 0x0010, "*");   
+          // Patient's ID
+          file->AddAnonymizeElement( 0x0010, 0x0020,"1515" );   
+          // Study Instance UID
+          file->AddAnonymizeElement(0x0020, 0x000d, tempuid );
+          // Telephone
+          file->AddAnonymizeElement(0x0010, 0x2154, "3615" );
+
+          // Aware user will add here more fields to anonymize here
+
+          // The gdcm::File is modified in memory
+
+          file->AnonymizeFile();
+
+          
+          i++;
+          fh->SetContentType(GDCM_NAME_SPACE::UNMODIFIED_PIXELS_IMAGE);
+   
+          fh->WriteDcmExplVR(file->GetFileName() +".ano1" );
+          std::cout << i <<"  End Anonymize" << std::cout;  
+          file->ClearAnonymizeList();
+          file->Delete();
+          fh->Delete();
+   }
+}
 ////////////////////////////////////////////////////////////////////////
 //void GimmickView::Anonymize(std::vector<std::string> i_filenames, int type)
 //{
@@ -946,4 +1001,4 @@ void GimmickView::ReadImagesNotThreadedInVector(std::vector<vtkImageData*>& s, s
 //     }
 //}
 //
-} // EO namespace creaImageIO
\ No newline at end of file
+} // EO namespace creaImageIO