Getting images into vtk from Java quickly (was [vtkusers]vtkImageImport in java?)

Stewart, Terry Terry.Stewart at xeroxlabs.com
Sun Feb 12 20:18:58 EST 2006


David,

  Thanks for mentioning the existence of the SetJavaArray() method.  The
time to copy a 512x512 RGB image improved by two orders of magnitude ...
pretty nice.  This was a big help and greatly appreciated!

All,

  I couldn't find this SetJavaArray() method in the VTK book, user's
manual or on-line Doxygen class documentation.  It seems that it, as
well as GetJavaArray(), are created specifically for Java while Java
wrapping is occurring during a build (see ./Java/vtkWrapJava.c).   I'm
guessing that Doxygen works entirely off the VTK *.h files so these
Java-only methods won't be visible because of the special way they are
generated.  So as far as I can tell you won't find them documented
anywhere other than the mail archives.

  Regardless, it's great that they are there and a big thanks to
whomever implemented them.

Terry

>-----Original Message-----
>From: vtkusers-bounces+terry.stewart=xeroxlabs.com at vtk.org 
>[mailto:vtkusers-bounces+terry.stewart=xeroxlabs.com at vtk.org] 
>On Behalf Of David Marshburn
>Sent: Friday, February 10, 2006 3:35 PM
>To: vtkusers at vtk.org
>Subject: Getting images into vtk from Java quickly (was 
>[vtkusers]vtkImageImport in java?)
>
>
>On Fri, 10 Feb 2006 vtkusers-request at vtk.org wrote:
>
>> ------------------------------
>> Message: 3
>> Date: Thu, 9 Feb 2006 10:35:49 -0800
>> From: "Stewart, Terry" <Terry.Stewart at xeroxlabs.com>
>> 
>> Steve,
>> 
>>   I'm using Java and ran into a similar situation while 
>trying to get 
>> my internally-generated RGB image into vtkImageData.  I'd tried the 
>> vtkImageImport path too only to run into the same roadblock with the 
>> missing [Copy|Set]ImportVoidPointer() methods for Java.  I've gotten 
>> my logic to a functional state via:
>> 
>>    vtkImageData imageData = new vtkImageData();
>>          :
>>    for (x = 0; ...)
>>       for (y = 0; ... )
><snip>
>> 
>> However this is quite slow.  Did you use some other mechanism to get 
>> your image data inserted into vtkImageData that is perhaps more 
>> efficient?
>
>> ------------------------------
>> 
>> Message: 6
>> Date: Thu, 09 Feb 2006 18:08:23 -0500
>> From: "Steve M. Robbins" <steven.robbins at videotron.ca>
>> Subject: Re: Ghosts and Extents (was [vtkusers] vtkImageImport in
>> 	java?)
>> 
>> > However this is quite slow. 
>> 
>> Yep.
>> 
>> > Did you use some other mechanism to get your image data inserted 
>> > into vtkImageData that is perhaps more efficient?
>> 
>> Yep.  We wrote JNI code that effectively does a memcpy() to 
>> vtkImage.GetVoidPointer().  I'd give you the code except 
>that the JNI 
>> bit is very specific to our application so it really wouldn't help 
>> you.
>> 
>> ------------------------------
>> 
>> Message: 7
>> Date: Thu, 9 Feb 2006 15:32:19 -0800
>> From: "Stewart, Terry" <Terry.Stewart at xeroxlabs.com>
>> Subject: RE: Ghosts and Extents (was [vtkusers] vtkImageImport in
>> 	java?)
>> 
>>   OK, thanks.   Updating the JNI logic was an idea that my 
>team had been
>> contemplating.  Thanks for the confirmation.  And right, the 
>interface 
>> updates we'd like to make would likely be different than 
>yours, so no 
>> problem there.
>
>Before anyone goes to the length of writing jni code, here is 
>a fast way to get image data from Java down into vtk.  As with 
>(arguably) any vtk issue, the solution lies in finding just 
>the right class and function out of a sea of thousands of 
>candidates! :)  (for a year or more, our group thought that 
>there was no fast way to get bulk data from java into vtk)
>
>in Java, vtkImageData has a SetScalars method that takes as an 
>arguement a vtkDataArray.  vtkDataArray has a bunch of 
>subclasses specific to array-element types (e.g., 
>vtkUnsignedCharArray, vtkUnsignedShortArray, vtkFloatArray, 
>etc.).  In Java, these data-array classes have a SetJavaArray 
>method that does fast copying.
>
>some code like the following should work (this is for a 3D 
>image stack):
>
>  protected vtkImageData imageData_vtk = new vtkImageData( );
>  protected vtkDataArray dataArray_vtk = null;
>  protected Object singleArray = null;
>	....
>
>	// for 8-bit pixels
>	imageData_vtk.SetScalarTypeToUnsignedChar();
>	imageData_vtk.SetNumberOfScalarComponents( 1 );
>	dataArray_vtk = new vtkUnsignedCharArray( );
>	
>	imageData_vtk.SetDimensions( imageWidth, imageHeight, 
>numImages );
>	singleArray = new byte[ imageWidth * imageHeight * numImages ];
>	imageData_vtk.AllocateScalars();
>
>	// fill in singleArray, possibly using System.arraycopy
>
>	( (vtkUnsignedCharArray) dataArray_vtk).SetJavaArray( 
>(byte[]) singleArray );
>	imageData_vtk.GetPointData().SetScalars( dataArray_vtk );
>
>this was written to be used for images of possibly many types; 
>the code would be simpler if you will only ever care about 
>8-bit images.
>
>on a not-terribly-fast computer, this code will stuff a 50 or 
>so 512x512 images into vtk in an amount of time that isn't 
>notable, like a second or two?  i've not timed it, although it 
>is no longer wearisome to load images in our java/vtk application!
>
>cheers,
>-david
>
>
>_______________________________________________
>This is the private VTK discussion list. 
>Please keep messages on-topic. Check the FAQ at: 
>http://www.vtk.org/Wiki/VTK_FAQ Follow this link to 
>subscribe/unsubscribe:
>http://www.vtk.org/mailman/listinfo/vtkusers
>



More information about the vtkusers mailing list