<div dir="ltr">Hello all,<br><br>I&#39;m busy doing a fourth year project that requires the use of VTK. While i am new to this package, I have read both the Kitware books (that i own.<br>I have done my best in terms of searching the web, the vtkusers mailing list and read the two books. I have spent two weeks on this issue.<br>
<br>Configuration Details:<br>Operating System: Windows XP SP3 and Ubuntu 8.04<br>VTK Version: 5.0.4<br>Compiler: Using pure C++ with gcc.<br><br>The problem i am having is related to my lack of understanding of the requirements for the vtkImageExport class. I have the need to load images in<br>
general Imaging formats: .jpg, .bmp, .tif, and .png. In order to load these images I make use of the related images (vtkJPEGReader etc).<br><br>I found a great example in the release folder: VTK_5.0.4/VTK/Imaging/Testing/Cxx/ImportExport.cxx that makes use of the vtkImageReader. This example works 100% without any problems:<br>
<br>int ImportExport( int argc, char *argv[] )<br>{<br>&nbsp;int i,j,k;<br>&nbsp;<br>&nbsp;char* fname = vtkTestUtilities::ExpandDataFileName(argc, argv, &quot;Data/headsq/quarter&quot;);<br>&nbsp;<br>&nbsp;vtkImageReader *reader = vtkImageReader::New();<br>
&nbsp;reader-&gt;SetDataByteOrderToLittleEndian();<br>&nbsp;reader-&gt;SetDataExtent(0,63,0,63,1,93);<br>&nbsp;reader-&gt;SetFilePrefix(fname);<br>&nbsp;reader-&gt;SetDataMask(0x7fff);<br>&nbsp;delete [] fname;<br>&nbsp;<br>&nbsp;// create exporter<br>&nbsp;vtkImageExport *exporter = vtkImageExport::New();<br>
&nbsp;exporter-&gt;SetInputConnection(reader-&gt;GetOutputPort());<br>&nbsp;exporter-&gt;ImageLowerLeftOn();<br><br>&nbsp;// get info from exporter and create array to hold data<br>&nbsp;int memsize = exporter-&gt;GetDataMemorySize();<br>&nbsp;int *dimensions = exporter-&gt;GetDataDimensions();<br>
<br><br>&nbsp;// export the data into the array<br>&nbsp;short *data = new short[memsize/sizeof(short)];<br>&nbsp;exporter-&gt;Export(data);<br>&nbsp;<br>&nbsp;// alternative method for getting data<br>&nbsp;// short *data = exporter-&gt;GetPointerToData(); <br>
<br>&nbsp;// do a little something to the data<br><br>&nbsp;for (i = 0; i &lt; dimensions[2]; i++)<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp; for (j = 0; j &lt; dimensions[1]; j++)<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp; for (k = 0; k &lt; dimensions[0]; k++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (k % 10 == 0)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data[k + dimensions[0]*(j + dimensions[1]*i)] = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (j % 10 == 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data[k + dimensions[0]*(j + dimensions[1]*i)] = 1000;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp; }<br><br>&nbsp;// create an importer to read the data back in<br>&nbsp;vtkImageImport *importer = vtkImageImport::New();<br>&nbsp;importer-&gt;SetWholeExtent(1,dimensions[0],1,dimensions[1],1,dimensions[2]);<br>&nbsp;importer-&gt;SetDataExtentToWholeExtent();<br>
&nbsp;importer-&gt;SetDataScalarTypeToShort();<br>&nbsp;importer-&gt;SetImportVoidPointer(data);<br><br><br>&nbsp;vtkImageViewer *viewer = vtkImageViewer::New();<br>&nbsp;viewer-&gt;SetInputConnection(importer-&gt;GetOutputPort());<br>&nbsp;viewer-&gt;SetZSlice(45);<br>
&nbsp;viewer-&gt;SetColorWindow(2000);<br>&nbsp;viewer-&gt;SetColorLevel(1000);<br><br>&nbsp;viewer-&gt;Render();<br><br>&nbsp;int retVal = vtkRegressionTestImage( viewer-&gt;GetRenderWindow() );<br>&nbsp; <br>&nbsp;viewer-&gt;Delete();<br>&nbsp;importer-&gt;Delete();<br>
&nbsp;exporter-&gt;Delete();<br>&nbsp;reader-&gt;Delete();<br>&nbsp;<br>&nbsp;delete [] data;<br><br>&nbsp;return !retVal;<br>}<br><br>However when i change the image reader to make use of any other reader (jpeg, bmp, tiff, or png) the image does not<br>
render correctly. Im assume that this is due to the images im using having three scalar componenets?<br><br>vtkJPEGReader *reader = vtkJPEGReader::New();<br>reader-&gt;SetDataByteOrderToLittleEndian();<br>reader-&gt;SetFileName(fileName); // Load the image into the image reader.<br>
reader-&gt;ImageLowerLeftOn();<br>reader-&gt;Update();<br>reader-&gt;Print(std::cout);<br><br>Im not looking for a full worked solution for anyone, just hoping that someone could point me in a direction that could help me out alittle.<br>
<br>The reason I need to export the images is to run some external transformations on the images, after going through several of the amazing VTK filters. This<br>needs to be read back into VTK to perform some nice 3D modelling and then redendering.<br>
<br>When I export then Import (without any modification) the image come back in red and blue colouring, but the image is not rendereded correctly. Each of the<br>rows of pixels get rendered at a strange location on the screen.<br>
<br>Thank you for taking the time to read this email, I hope i gave enough light into my problem for someone to give some advice.<br><br>Regards<br>Andrew Rapson<br></div>