Browse Source

Create thumbnails for imported DICOM files

Marco Nolden 14 years ago
parent
commit
85877fc47b
2 changed files with 36 additions and 7 deletions
  1. 35 5
      Libs/DICOM/Core/ctkDICOMIndexer.cpp
  2. 1 2
      Libs/DICOM/Core/ctkDICOMIndexer.h

+ 35 - 5
Libs/DICOM/Core/ctkDICOMIndexer.cpp

@@ -29,9 +29,13 @@
 #include <QDirIterator>
 #include <QFileInfo>
 #include <QDebug>
+#include <QPixmap>
+
 
 // ctkDICOM includes
 #include "ctkDICOMIndexer.h"
+#include "ctkDICOMImage.h"
+
 
 // DCMTK includes
 #ifndef WIN32
@@ -45,6 +49,7 @@
 #include <dcmtk/ofstd/ofstring.h>
 #include <dcmtk/ofstd/ofstd.h>        /* for class OFStandard */
 #include <dcmtk/dcmdata/dcddirif.h>   /* for class DicomDirInterface */
+#include "dcmimage.h"
 
 #define MITK_ERROR std::cout
 #define MITK_INFO std::cout
@@ -85,7 +90,7 @@ ctkDICOMIndexer::~ctkDICOMIndexer()
 }
 
 //------------------------------------------------------------------------------
-void ctkDICOMIndexer::addDirectory(ctkDICOMDatabase& database, const QString& directoryName,const QString& destinationDirectoryName, bool createHierarchy)
+void ctkDICOMIndexer::addDirectory(ctkDICOMDatabase& database, const QString& directoryName,const QString& destinationDirectoryName, bool createHierarchy, bool createThumbnails)
 {
   QSqlDatabase db = database.database();
   const std::string src_directory(directoryName.toStdString());
@@ -366,6 +371,11 @@ void ctkDICOMIndexer::addDirectory(ctkDICOMDatabase& database, const QString& di
     }
 
     lastSeriesInstanceUID = seriesInstanceUID;
+    QString studySeriesDirectory;
+    if (createHierarchy || createThumbnails)
+    {
+      studySeriesDirectory = QString(studyInstanceUID.c_str()) + "/" + seriesInstanceUID.c_str();
+    }
 
     //----------------------------------
     //Move file to destination directory
@@ -375,16 +385,36 @@ void ctkDICOMIndexer::addDirectory(ctkDICOMDatabase& database, const QString& di
       {
       QFile currentFile( qfilename );
       QDir destinationDir(destinationDirectoryName + "/dicom");
-      QString destFileName = seriesInstanceUID.c_str();
+      QString destFileName = sopInstanceUID.c_str();
       if (createHierarchy)
       {
-        QString uniqueDirName = QString(studyInstanceUID.c_str()) + "/" + seriesInstanceUID.c_str();
-        destinationDir.mkpath(uniqueDirName);
-        destFileName.prepend( destinationDir.absolutePath() + "/"  + uniqueDirName + "/" );
+        destinationDir.mkpath(studySeriesDirectory);
+        destFileName.prepend( destinationDir.absolutePath() + "/"  + studySeriesDirectory + "/" );
       }
       currentFile.copy(destFileName);
       qfilename = destFileName;
     }
+
+    if (createThumbnails)
+    {
+      QString databaseFile = database.GetDatabaseFilename();
+      if (!QFileInfo(databaseFile).isAbsolute())
+      {
+        databaseFile.prepend(QDir::currentPath() + "/");
+      }
+
+      QString thumbnailBaseDir = QFileInfo ( databaseFile ).absoluteDir().path() + "/thumbs/";
+      QString thumbnailFilename = thumbnailBaseDir + "/" + studySeriesDirectory + "/" + sopInstanceUID.c_str() + ".png";
+      QFileInfo thumbnailInfo(thumbnailFilename);
+      if ( ! ( thumbnailInfo.exists() && thumbnailInfo.lastModified() < QFileInfo(qfilename).lastModified() ) )
+      {
+        QDir(thumbnailBaseDir).mkpath(studySeriesDirectory);
+        DicomImage dcmtkImage(qfilename.toAscii());
+        ctkDICOMImage ctkImage(&dcmtkImage);
+        QImage image( ctkImage.getImage(0) );
+        image.scaled(128,128,Qt::KeepAspectRatio).save(thumbnailFilename,"PNG");
+      }
+    }
     // */
     //------------------------
     //Add Filename to Database

+ 1 - 2
Libs/DICOM/Core/ctkDICOMIndexer.h

@@ -34,9 +34,8 @@ public:
   explicit ctkDICOMIndexer();
   virtual ~ctkDICOMIndexer();
   /// add directory to database and optionally copy files to destinationDirectory
-  void addDirectory(ctkDICOMDatabase& database, const QString& directoryName, const QString& destinationDirectoryName = "", bool createHierarchy = true);
+  void addDirectory(ctkDICOMDatabase& database, const QString& directoryName, const QString& destinationDirectoryName = "", bool createHierarchy = true, bool createThumbnails = true);
   void refreshDatabase(ctkDICOMDatabase& database, const QString& directoryName);
-
 protected:
   QScopedPointer<ctkDICOMIndexerPrivate> d_ptr;