diff --git a/invesalius/gui/dicom_preview_panel.py b/invesalius/gui/dicom_preview_panel.py index d7f4f32..40b7298 100755 --- a/invesalius/gui/dicom_preview_panel.py +++ b/invesalius/gui/dicom_preview_panel.py @@ -22,6 +22,7 @@ #TODO: To create a beautiful API import time +import tempfile import wx import vtk @@ -34,6 +35,8 @@ from reader import dicom_reader import data.vtk_utils as vtku import utils import vtkgdcm + + NROWS = 3 NCOLS = 6 NUM_PREVIEWS = NCOLS*NROWS @@ -102,31 +105,18 @@ class DicomInfo(object): self.subtitle = subtitle self._preview = None self.selected = False + self.filename = "" @property def preview(self): - rdicom = vtkgdcm.vtkGDCMImageReader() - if self._preview: - return self._preview - else: - rdicom.SetFileName(self.dicom.image.file) - rdicom.Update() - - colorer = vtk.vtkImageMapToWindowLevelColors() - colorer.SetInput(rdicom.GetOutput()) - colorer.SetWindow(float(self.dicom.image.window)) - colorer.SetLevel(float(self.dicom.image.level)) - colorer.SetOutputFormatToRGB() - colorer.Update() - - width, height, z = colorer.GetOutput().GetDimensions() - - r = colorer.GetOutput().GetPointData().GetScalars() - ni = numpy_support.vtk_to_numpy(r) - self.img = wx.ImageFromBuffer(width, height, ni) - self._preview = self.img.Mirror(False) - return self._preview - + + if not self._preview: + bmp = wx.Bitmap(self.dicom.image.thumbnail_path, wx.BITMAP_TYPE_PNG) + self._preview = bmp.ConvertToImage() + return self._preview + + def release_thumbnail(self): + self._preview = None class DicomPaintPanel(wx.Panel): def __init__(self, parent): @@ -238,6 +228,9 @@ class Preview(wx.Panel): """ Set a dicom to preview. """ + if self.dicom_info: + self.dicom_info.release_thumbnail() + self.dicom_info = dicom_info self.SetTitle(dicom_info.title) self.SetSubtitle(dicom_info.subtitle) @@ -409,7 +402,6 @@ class DicomPreviewSeries(wx.Panel): def _display_previews(self): initial = self.displayed_position * NCOLS final = initial + NUM_PREVIEWS - if len(self.files) < final: for i in xrange(final-len(self.files)): try: @@ -557,7 +549,6 @@ class DicomPreviewSlice(wx.Panel): def _display_previews(self): initial = self.displayed_position * NCOLS final = initial + NUM_PREVIEWS - if len(self.files) < final: for i in xrange(final-len(self.files)): try: diff --git a/invesalius/reader/dicom.py b/invesalius/reader/dicom.py index ed2e2a1..f2ea447 100644 --- a/invesalius/reader/dicom.py +++ b/invesalius/reader/dicom.py @@ -139,9 +139,10 @@ class Parser(): # return None#self.vtkgdcm_reader.GetOutput() - def SetDataImage(self, data_image, filename): + def SetDataImage(self, data_image, filename, thumbnail_path): self.data_image = data_image self.filename = self.filepath = filename + self.thumbnail_path = thumbnail_path def __format_time(self,value): sp1 = value.split(".") @@ -1931,6 +1932,7 @@ class Image(object): self.size = (parser.GetDimensionX(), parser.GetDimensionY()) #self.imagedata = parser.GetImageData() self.bits_allocad = parser._GetBitsAllocated() + self.thumbnail_path = parser.thumbnail_path if (parser.GetImageThickness()): try: diff --git a/invesalius/reader/dicom_reader.py b/invesalius/reader/dicom_reader.py index 77920f2..50303fe 100644 --- a/invesalius/reader/dicom_reader.py +++ b/invesalius/reader/dicom_reader.py @@ -19,10 +19,12 @@ import os import Queue import threading +import tempfile from multiprocessing import cpu_count import vtk +import vtkgdcm import gdcm import wx.lib.pubsub as ps @@ -106,9 +108,8 @@ class LoadDicom(threading.Thread): reader.SetFileName(str(filepath)) if (reader.Read()): - file = reader.GetFile() - + # Retrieve data set dataSet = file.GetDataSet() @@ -173,6 +174,41 @@ class LoadDicom(threading.Thread): data_dict[group][field] = "Invalid Character" + + # -------------- To Create DICOM Thumbnail ----------- + rvtk = vtkgdcm.vtkGDCMImageReader() + rvtk.SetFileName(str(filepath)) + rvtk.Update() + + try: + data = data_dict['0028']['1050'] + level = [float(value) for value in data.split('\\')][0] + data = data_dict['0028']['1051'] + window = [float(value) for value in data.split('\\')][0] + except(KeyError): + level = 300.0 + window = 2000.0 + + colorer = vtk.vtkImageMapToWindowLevelColors() + colorer.SetInput(rvtk.GetOutput()) + colorer.SetWindow(float(window)) + colorer.SetLevel(float(level)) + colorer.SetOutputFormatToRGB() + colorer.Update() + + resample = vtk.vtkImageResample() + resample.SetInput(colorer.GetOutput()) + resample.SetAxisMagnificationFactor ( 0, 0.25 ) + resample.SetAxisMagnificationFactor ( 1, 0.25 ) + resample.SetAxisMagnificationFactor ( 2, 1 ) + resample.Update() + + thumbnail_path = tempfile.mktemp() + + write_png = vtk.vtkPNGWriter() + write_png.SetInput(resample.GetOutput()) + write_png.SetFileName(thumbnail_path) + write_png.Write() # ---------- Refactory -------------------------------------- data_dict['invesalius'] = {'orientation_label' : GetImageOrientationLabel(str(filepath))} @@ -190,7 +226,7 @@ class LoadDicom(threading.Thread): if not(is_dicom_dir): parser = dicom.Parser() - parser.SetDataImage(dict_file[filepath], filepath) + parser.SetDataImage(dict_file[filepath], filepath, thumbnail_path) dcm = dicom.Dicom() self.l.acquire() -- libgit2 0.21.2