Просмотр исходного кода

Fixed windows path problems for image preview. Added DICOM color image support.

Michael Onken лет назад: 14
Родитель
Сommit
7bba48e18c
1 измененных файлов с 57 добавлено и 25 удалено
  1. 57 25
      Libs/DICOM/Widgets/ctkDICOMDatasetView.cpp

+ 57 - 25
Libs/DICOM/Widgets/ctkDICOMDatasetView.cpp

@@ -21,7 +21,8 @@
 #include <iostream>
 
 // DCMTK includes
-#include <dcmimage.h>
+#include <dcmtk/dcmimgle/dcmimage.h>
+#include <dcmtk/dcmimage/diregist.h> /* Include color image support */
 
 // CTK includes
 #include "ctkLogger.h"
@@ -36,6 +37,7 @@
 
 // Qt includes
 #include <QDebug>
+#include <QDir>
 #include <QFile>
 #include <QHBoxLayout>
 #include <QKeyEvent>
@@ -119,7 +121,7 @@ void ctkDICOMDatasetViewPrivate::setImage(const QModelIndex &imageIndex, bool de
         dicomPath.append("/").append(model->data(imageIndex ,ctkDICOMModel::UIDRole).toString());
 
         if (QFile(dicomPath).exists()){
-            DicomImage dcmImage( dicomPath.toStdString().c_str() );
+          DicomImage dcmImage(  QDir::toNativeSeparators(dicomPath).toStdString().c_str() );
 
             q->clearImages();
             q->addImage(dcmImage, defaultIntensity);
@@ -260,30 +262,60 @@ void ctkDICOMDatasetView::addImage( DicomImage & dcmImage, bool defaultIntensity
 {
     Q_D(ctkDICOMDatasetView);
     QImage image;
-    if ((dcmImage.getStatus() == EIS_Normal)){
-        if(defaultIntensity){
-            dcmImage.setWindow(0);
-            dcmImage.getWindow(d->DicomIntensityLevel, d->DicomIntensityWindow);
-        }else{
-            dcmImage.setWindow(d->DicomIntensityLevel, d->DicomIntensityWindow);
+    // Check whether we have a valid image
+    EI_Status result = dcmImage.getStatus();
+    if (result != EIS_Normal)
+    {
+      logger.error(QString("Rendering of DICOM image failed for thumbnail failed: ") + DicomImage::getString(result));
+      return;
+    }
+    // Select first window defined in image. If none, compute min/max window as best guess.
+    // Only relevant for monochrome
+    // TODO: Re-Use code from ctkDICOMThumbnailGenerator by re-factoring it to a function?
+    if (dcmImage.isMonochrome())
+    {
+        if (defaultIntensity && dcmImage.getWindowCount() > 0)
+        {
+          dcmImage.setWindow(0);
         }
-        /* get image extension */
-        const unsigned long width = dcmImage.getWidth();
-        const unsigned long height = dcmImage.getHeight();
-        QString header = QString("P5 %1 %2 255\n").arg(width).arg(height);
-        const unsigned long offset = header.length();
-        const unsigned long length = width * height + offset;
-        /* create output buffer for DicomImage class */
-        QByteArray buffer;
-        buffer.append(header);
-        buffer.resize(length);
-
-        /* copy PGM header to buffer */
-
-        if (dcmImage.getOutputData(static_cast<void *>(buffer.data() + offset), length - offset, 8, 0)){
-            if (!image.loadFromData( buffer )){
-                logger.error("QImage couldn't created");
-            }
+        else
+        {
+          dcmImage.setWindow(d->DicomIntensityLevel, d->DicomIntensityWindow);
+        }
+    }
+    /* get image extension and prepare image header */
+    const unsigned long width = dcmImage.getWidth();
+    const unsigned long height = dcmImage.getHeight();
+    unsigned long offset = 0;
+    unsigned long length = 0;
+    QString header;
+
+    if (dcmImage.isMonochrome())
+    {
+      // write PGM header (binary monochrome image format)
+      header = QString("P5 %1 %2 255\n").arg(width).arg(height);
+      offset = header.length();
+      length = width * height + offset;
+    }
+    else
+    {
+      // write PPM header (binary color image format)
+      header = QString("P6 %1 %2 255\n").arg(width).arg(height);
+      offset = header.length();
+      length = width * height * 3 /* RGB */ + offset;
+    }
+    /* create output buffer for DicomImage class */
+    QByteArray buffer;
+    /* copy header to output buffer and resize it for pixel data */
+    buffer.append(header);
+    buffer.resize(length);
+
+    /* render pixel data to buffer */
+    if (dcmImage.getOutputData(static_cast<void *>(buffer.data() + offset), length - offset, 8, 0))
+    {  
+      if (!image.loadFromData( buffer ))
+        {
+            logger.error("QImage couldn't created");
         }
     }
     this->addImage(image);