Page MenuHomePhabricator

Opening RGB image crashes MITK
Closed, ResolvedPublic

Description

When opening a 3D RGBA image in MITK, the application crashes with a segmentation fault, because in

mitkImageMapperGL2D.cpp:1277 image->GetPixelType().GetItkTypeId() returns 0:

if(((overwrite) || (node->GetProperty("opaclevelwindow", renderer)==NULL))

&& *(image->GetPixelType().GetItkTypeId()) == typeid(itk::RGBAPixel<unsigned char>))

Event Timeline

The image was actually a RGB image (no alpha channel). It still crashes MITK.

The problem is that when creating a mitk::PixelType instance in

mitkImage.cpp:994

with a mitkIpPicDescriptor, the mitk::PixelType constructor calls mitk::PixelType::Initialize(mitkIpPicType_t type,...) which seems to correctly fill local variables, but at the end of the method the following code sets the mitk::PixelType::m_ItkTypeId member to NULL (m_NumberOfComponents == 3):

if(m_NumberOfComponents == 1)

m_ItkTypeId = m_TypeId;

else

m_ItkTypeId = NULL;

Always setting m_ItkTypeId = m_TypeId allows MITK to successfully load the RGB image. I don't know if this has any side effects...

Git bisect reveals:

5460194700a5a466c2526003ca1d0cc5020d2d7a is the first bad commit
commit 5460194700a5a466c2526003ca1d0cc5020d2d7a
Author: fritzsck <fritzsck@71702c7f-912c-0410-a943-c01e831098ea>
Date: Fri Oct 1 11:32:30 2010 +0000

FIX (#5542): implemented opacity level window for RGBA images

git-svn-id: http://mbits/svn/mitk/trunk@26536 71702c7f-912c-0410-a943-c01e831098ea

These changes (related to T5542) introduced the following code:

@@ -1239,6 +1252,15 @@ void mitk::ImageMapperGL2D::SetDefaultProperties(mitk::DataNode* node, mitk::Bas

  levWinProp->SetLevelWindow( levelwindow );
  node->SetProperty( "levelwindow", levWinProp, renderer );
}

+ if(((overwrite) || (node->GetProperty("opaclevelwindow", renderer)==NULL))
+ && *(image->GetPixelType().GetItkTypeId()) == typeid(itk::RGBAPixel<unsigned char>))
+ {
+ mitk::LevelWindow opaclevwin;
+ opaclevwin.SetRangeMinMax(0,255);
+ opaclevwin.SetWindowBounds(0,255);
+ mitk::LevelWindowProperty::Pointer prop = mitk::LevelWindowProperty::New(opaclevwin);
+ node->SetProperty( "opaclevelwindow", prop, renderer );
+ }

if((overwrite) || (node->GetProperty("LookupTable", renderer)==NULL))
{
  // add a default rainbow lookup table for color mapping

which crashes in the case of a RGB image because image->GetPixelType() returns NULL.

  • What is the reason the image->GetPixelType() can be NULL at all?
  • What side-effect would the change proposed in comment 2 have?

Could you provide a test dataset? I did not manage to reproduce the crashes.

[SVN revision 27276] FIX (#5542): Added check for existing itk type id in the image's pixeltype

This fix prevents the crash. Anyhow, the content of ItkTypeID and TypeID in the mitkPixelType remains unclear. mitkImageWriter also crashes when saving the RGBA image (I tried it with extension .NRRD). The following fix solves this:

Index: mitk/Core/Code/IO/mitkImageWriter.cpp

  • mitk/Core/Code/IO/mitkImageWriter.cpp (revision 27271)

+++ mitk/Core/Code/IO/mitkImageWriter.cpp (working copy)
@@ -86,8 +86,16 @@

// Set the necessary information for imageIO
imageIO->SetNumberOfDimensions(dimension);
  • imageIO->SetPixelTypeInfo( *(pixelType.GetItkTypeId()) );

+ if(pixelType.GetItkTypeId())
+ {
+ imageIO->SetPixelTypeInfo( *(pixelType.GetItkTypeId()) );
+ }
+ else
+ {
+ imageIO->SetPixelTypeInfo( *(pixelType.GetTypeId()) );
+ }
+

if(pixelType.GetNumberOfComponents() > 1)
  imageIO->SetNumberOfComponents(pixelType.GetNumberOfComponents());

rev 27276 is merged in 3m3 1.1 branch

@Jan: do you think this can be closed? The crash seems to be fixed and you reworked a lot in this area.

Fixed by refactoring of Image / PixelType class. Closing bug.