[Insight-users] Re: Importing image data from a byte array

Chris Farmer cfarmer at scitegic.com
Wed Sep 7 16:39:07 EDT 2005



Thanks for the pointers to the ImportImageFilter, but I'm still having
problems.  Either I'm doing something stupid, misunderstanding a
fundamental concept, or both.  I read through the pdf in the getting
started V guide, and it looked a lot like the Image5 example in the
source distribution, so I started trying to bastardize the Image5.cxx
file to accomplish my goal of importing a byte array (containing png
data) into an itk image.  I used a cheesy 240 x 160 pixel png I found on
the web as a data source.  I just read its bytes into an unsigned char
array, then try to use that array as a source in the SetImportPointer
call.  I don't get any exception thrown, but my output file
(burgerout.png) is a garbled image looking nothing like the original.
Clearly I'm missing something.  Is it acceptable to pass in PNG data in
this way?

Thanks,
Chris


Here's the code that I'm trying to use:

  typedef unsigned char PixelType;
  const unsigned int Dimension = 2;
  typedef itk::Image< PixelType, Dimension > ImageType;
  typedef itk::ImportImageFilter< PixelType, Dimension >
ImportFilterType;
  
  ImportFilterType::Pointer importFilter = ImportFilterType::New();

  ImportFilterType::SizeType  size;

  size[0]  = 240;
  size[1]  = 160;
  
  ImportFilterType::IndexType start;
  start.Fill( 0 );

  ImportFilterType::RegionType region;
  region.SetIndex( start );
  region.SetSize(  size  );

  importFilter->SetRegion( region );
  
  double origin[ Dimension ];
  origin[0] = 0.0;  
  origin[1] = 0.0;  
  importFilter->SetOrigin( origin );
  
  double spacing[ Dimension ];
  spacing[0] = 1.0;   
  spacing[1] = 1.0;  
  importFilter->SetSpacing( spacing );
  
  PixelType * localBuffer = new PixelType[ 4131 ];
  FILE* f;
  f = fopen("C:\\burger.PNG", "r+b");
  size_t read = fread(localBuffer, sizeof(PixelType), 4131, f);
  fclose(f);

  // make sure the data in localBuffer is correct
  f = fopen("c:\\burgertest.png", "w+b");
  fwrite(localBuffer, sizeof(PixelType), read, f);
  fclose(f);

  const bool importImageFilterWillOwnTheBuffer = true;
  importFilter->SetImportPointer( localBuffer, read, 
                                  importImageFilterWillOwnTheBuffer );
  importFilter->Update();

  typedef itk::ImageFileWriter< ImageType > WriterType;
  WriterType::Pointer writer = WriterType::New();
  writer->SetFileName( "c:\\burgerout.png" );
  writer->SetInput(  importFilter->GetOutput()  );

  try
    {
    writer->Update();
    }
  catch( itk::ExceptionObject & exp ) 
    {
    std::cerr << "Exception caught !" << std::endl;
    std::cerr << exp << std::endl;
    }


 

-----Original Message-----
From: Brian Eastwood [mailto:beastwoo at email.unc.edu] 
Sent: Tuesday, September 06, 2005 7:07 PM
To: insight-users at itk.org
Subject: [Insight-users] Re: Importing image data from a byte array

Hi Chris,

You are looking for the itk::ImportImageFilter.  An example of how to 
use it is in the Getting Started V guide available here:

http://www.itk.org/HTML/Tutorials.htm

You first need to set up the size, origin, and spacing of your image.  
The method ImportImageFilter::SetImportPointer() allows you to pass the 
pointer to your image buffer--you specify the size of the image buffer 
and indicate whether you want ITK to manage the buffer memory.

Hope this helps.
Brian

>Message: 4
>Date: Tue, 6 Sep 2005 16:21:04 -0700
>From: "Chris Farmer" <cfarmer at scitegic.com>
>Subject: [Insight-users] Importing image data from a byte array
>To: <insight-users at itk.org>
>Message-ID:
>	<830D8D4719112B418ABBC3A0EBA958128FA568 at webmail.scitegic.com>
>Content-Type: text/plain; charset="us-ascii"
>
> 
>Hi.  I've just started working with the ITK library and have a simple
>question.  In my current application, I have a byte array that contains
>image data (usually in png format).  I'd like to use that data in the
>ITK world, but I can't see a good way to use it without first writing
>out a file and using the standard reader model that is shown in the
>examples.  I poked through the ImageIOBase code to see how easy it
would
>be to use a byte array as a data source instead of a file, but it
didn't
>seem too obvious.
> 
>Can someone please give me a pointer to using a byte array as a source
>of image data?
> 
> 
>Thanks,
>Chris
>
_______________________________________________
Insight-users mailing list
Insight-users at itk.org
http://www.itk.org/mailman/listinfo/insight-users


 


More information about the Insight-users mailing list