[Insight-users] Java wrappers import/export data

Alejandro Canales Ochoa aco at cion.com.mx
Wed, 3 Mar 2004 13:52:55 -0600


Hi Bill

I was thinking in your words. 
I have the following proposal for the import issue: implement a java version of ImportImageFilter within the java wrappers, I mean a class with native methods that can access a “real” ImportImageFilter. I was looking how the wrappers works and I imagine something like this:

public class itkImportImageFilterJNI {
	protected native static long itkImportImageFilterUS2_New();
	protected native static void setDataSI2(long ptr, short[] rawData);
	protected native static void setOrigin(long ptr, double[] origin);
	protected native static void setSpacing(long ptr,double[] spacing);
	protected native static void setSize(long ptr, int[] size);
	protected native static long getOutput(long ptr);
}

public class itkImportImageFilterUS2 {
	public static itkImportImageFilterUS2_Pointer itkImportImageFilterUS2_New() {
		return new itkImportImageFilterUS2_Pointer(itkImportImageFilterJNI.itkImportImageFilterUS2_New());
	}
}

public class itkImportImageFilterUS2_Pointer {
	protected long jniPointer;
	
	protected itkImportImageFilterUS2_Pointer(long pointer) {
		jniPointer = pointer;
	}
	
	public void setOrigin(double[] origin) {
		itkImportImageFilterJNI.setOrigin(jniPointer, origin);
	}
	
	public void setSpacing(double[] spacing) {
		itkImportImageFilterJNI.setSpacing(jniPointer, spacing);
	}
	
	public void setSize(int[] size) {
		itkImportImageFilterJNI.setSize(jniPointer, size);
	}
	
	public void setData(short[] rawData) {
		itkImportImageFilterJNI.setDataSI2(jniPointer, rawData);
	}
	
	public SWIGTYPE_p_itk__ImageTunsigned_short_2_t getOutput() {
		long outPtr = itkImportImageFilterJNI.getOutput(jniPointer);
		return (outPtr == 0) ? null : new SWIGTYPE_p_itk__ImageTunsigned_short_2_t(outPtr, false);
	}
}

	The next code shows how to use import filter with a PlanarImage:


public class itkImportImageFilterTest {
	
	public static void main(String[] args) throws Exception {
		PlanarImage image = PlanarImage.wrapRenderedImage(ImageIO.read(new File(args[0])));
		short[] rawBuffer = getRawData(image.getData().getDataBuffer());
		itkImportImageFilterUS2_Pointer importFilter = itkImportImageFilterUS2.itkImportImageFilterUS2_New();
		importFilter.setOrigin(new double[] { 0.0, 0.0 });
		importFilter.setSpacing(new double[] { 0.0, 0.0 });
		importFilter.setSize(new int[] { image.getWidth(), image.getHeight() } );
		importFilter.setData(rawBuffer);
		itkRescaleIntensityImageFilterUS2US2_Pointer filter = itkRescaleIntensityImageFilterUS2US2.itkRescaleIntensityImageFilterUS2US2_New();
		filter.SetOutputMinimum(0);
		filter.SetOutputMaximum(65536);
		filter.SetInput(importFilter.getOutput());
		itkImageFileWriterUS2_Pointer writer = itkImageFileWriterUS2.itkImageFileWriterUS2_New();
		writer.SetFileName(args[1]);
		writer.SetInput(filter.GetOutput());
		writer.Update();
	}
	
	public static short[] getRawData(DataBuffer buffer) {
		short[] data = new short[buffer.getSize()];
		for (int i = 0; i < data.length; i++) {
			data[i] = clampShort(buffer.getElem(i));
		}
		return data;
	}

	public static short clampShort(int x) {
		if (x < 0) {
			return 0;
		} 
		return (x > 65535) ? (short)65535 : (short)x;
	}	
}


Unfortunately I have not finished the proposal for the export, I am reading the wrapper’s source code and as you can imagine it’s not a quick reading. For the export I am thinking in an adapter, so you can set their input for example with an SWIGTYPE_p_itk__ImageTunsigned_short_2_t instance and get a short[] as output. Something like this:

public class itkJavaImageAdapterUS2 {
	protected long jniPointer; 
	
	protected itkJavaImageAdapterUS2(long ptr) {
		jniPointer = ptr;
	}
	
	public void setInput(SWIGTYPE_p_itk__ImageTunsigned_short_2_t input) {
		// DO THE JNI STUFF
	}
	
	public short[] getData() {
		short[] data = null;
		// OBTAIN THE DATA VIA AN ITERATOR (JNI CODE)
		return data;
	}	
}


I think I can try to do both import and export for my own. But I have some questions about compiling the wrappers (C++ code):

-	Can I compile ONLY the Wrappers DLL’s (wrap_itkXXXXXJava.cxx). When I modify something in the twrappers, there are many things are recompiled along the wrappers. (I am using Visual C++). I am using a centrino laptop, so you can imagine recompile is not very fast.
-	Why the function names are so strange?. I have used JNI and the function names usually are the prefix Java_ followed by the package + class + method names. But the wrappers do not follow this convention adding suffix like “1_1SWIG_10” to the methods name, also many intermediate l’s. I know that the code is generated by cswig but I am curious about the meaning of the l’s and the suffix.
-	Do you think that I need to make the changes directly in these files (wrap_itkXXXXX)? It’s all right if I make another library?


Another issue is that I think that this adapter needs to notify their peer when an update request was made.

What do you think?


Well I have to go. Thanks for your attention; I will check my email within the next hours.

Thanks in advance
Alejandro Canales









El Tue, 02 Mar 2004 15:12:09 -0500, billlist at nycap.rr.com escribio:
>
>Can you summarize the changes you would like?
>I have been out of the office for a week or so, and have
>been looking at your postings.  You can certainly help by providing
>a description of what you want, and possibly some implementation code.
>I guess the big thing you want is a way to send image data from
>java to ITK and from ITK to java.   What sort of API would you expect?
>How would you implement it if you did it by hand?
>
>-Bill
>
>
>
>At 02:33 AM 3/2/2004, Alejandro Canales Ochoa wrote:
>>In the case you at Kitware can implement my requirements, when can it will be done? Can I help in any way (except by no asking)? The case is that I need to deliver the app within two months, so I need to make some decisions here. 
>
>