[Insight-developers] Problem with large image file

Luis Ibanez luis.ibanez at kitware.com
Fri Sep 14 07:55:05 EDT 2007



Hi Thomas,

Thanks for pointing this out.

Your solution seems reasonable.

We are trying to work out the following details

1) The change will have to be applied across the board
    to any other classes that manage files. Eg. the derived
    ImageIO classes. This is just a matter of being consistent
    and making sure that the large integer is not truncated
    to a smaller one in any intermediate call.

2) In order to choose between std::streamoff and std::streampos
    we are looking at the following page from Boost:
    http://boost.org/libs/iostreams/doc/functions/positioning.html

3) We should consider the implications in 64bits architectures.


We are looking at the way VTK manage the size of files, and
it seems that it maps to a vtkIdType, which is configurable
to 64 bits depending of a selection of a CMake option.

In any case, we will start by introducing a typedef, so it
will be easier to propagate the type in a consistent manner.

A first suggestion will be to have in itk::ImageIOBase.h

           typedef std::streamoff   SizeType;

and replace:

   virtual unsigned int GetPixelStride () const;
   unsigned int GetImageSizeInPixels() const;
   unsigned int GetImageSizeInBytes() const;
   unsigned int GetImageSizeInComponents() const;

with:

   virtual SizeType GetPixelStride () const;
   SizeType GetImageSizeInPixels() const;
   SizeType GetImageSizeInBytes() const;
   SizeType GetImageSizeInComponents() const;


Just out of curiosity:

   a) How big was the file ?
   b) What file format are you using ?



Thanks


    Luis




----------------------
Thomas Feuvrier wrote:
> Dear ITK users
> 
> I am an OTB developer and I am trying to read very large image file with 
> itk::ImageFileReader.
> When I try to read such images, an error is generated at line 384 of the 
> itk::ImageFileReader, in the instruction m_ImageIO->GetImageSizeInBytes().
> 
> Indeed, the itk::ImageIOBase::GetImageSizeInBytes() method (which calls 
> this->GetImageSizeInComponents() * this->GetComponentSize(), ... ) 
> returns an "unsigned int" value. For large image file, "unsigned int" is 
> not well suited (4 bytes).
> The solution would be to replace "unsigned int" by  std::streamoff (8 
> bytes) or possibly std::streampos (16 bytes).
> Is there a way to bypass this problem ?
> 
> Best regards,
> Thomas
> 
> _______________________________________________
> Insight-developers mailing list
> Insight-developers at itk.org
> http://www.itk.org/mailman/listinfo/insight-developers
> 


More information about the Insight-developers mailing list