This example imports an RGB (red, green, and blue) image from the IDL distribution into a Java class. The image is in the glowing_gas.jpg file, which is in the examples/data directory of the IDL distribution. The Java class also displays the image in a Java Swing user-interface. Then, the image is accessed into IDL and displayed with the new iImage tool.
Note: The Java and IDL code for this example is provided in the resource/bridges/import/java/examples directory, but the Java code has not been built as part of the jbexamples.jar file.
Note: This example uses functionality only available in Java 1.6 and later.
Note: Due to a Java bug, this example (and any other example using Swing on AWT) will not work on Linux platforms.
The first and main Java class is FrameTest, which creates the Java Swing application that imports the image from the glowing_gas.jpg file. Copy and paste the following text into a file, then save it as FrameTest.java:
import java.awt.*
import java.awt.image.*
import java.awt.event.*
import javax.swing.*
import javax.swing.event.*
import java.io.File
public class FrameTest extends JFrame
{
RSIImageArea c_imgArea
int m_xsize
int m_ysize
Box c_controlBox
public FrameTest()
{
super("This is a JAVA Swing Program called from IDL")
// Dispose the frame when the sys close is hit
setDefaultCloseOperation(DISPOSE_ON_CLOSE)
m_xsize = 350
m_ysize = 371
buildGUI()
}
public void buildGUI()
{
c_controlBox = Box.createVerticalBox()
JLabel l1 = new JLabel("Example Java/IDL Interaction")
JButton bLoadFile = new JButton("Load new file")
bLoadFile.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
JFileChooser chooser = new JFileChooser(new
File("c:\\ITT\\IDL63\\EXAMPLES\\DATA"))
chooser.setDialogTitle("Enter a JPEG file")
if (chooser.showOpenDialog(FrameTest.this) == JFileChooser.APPROVE_OPTION)
{
java.io.File fname = chooser.getSelectedFile()
String filename = fname.getPath()
System.out.println(filename)
c_imgArea.setImageFile(filename)
}
}
})
JButton b1 = new JButton("Close this example")
b1.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
dispose()
}
})
c_imgArea = new
RSIImageArea("c:\\itt\\idl63\\examples\\data\\glowing_gas.jpg", new Dimension(m_xsize,m_ysize))
Box mainBox = Box.createVerticalBox()
Box rowBox = Box.createHorizontalBox()
rowBox.add(b1)
rowBox.add(bLoadFile)
c_controlBox.add(l1)
c_controlBox.add(rowBox)
mainBox.add(c_controlBox)
mainBox.add(c_imgArea)
getContentPane().add(mainBox)
pack()
c_imgArea.displayImage()
c_imgArea.addResizeListener(new RSIImageAreaResizeListener()
{
public void areaResized(int newx, int newy)
{
Dimension cdim = c_controlBox.getSize(null)
Insets i = getInsets()
newx = i.left + i.right + newx
newy = i.top + cdim.height + newy + i.bottom
setSize(new Dimension(newx, newy))
}
})
}
public void setImageData(int [] imgData, int xsize, int ysize)
{
MemoryImageSource ims = new MemoryImageSource(xsize, ysize, imgData, 0, ysize)
Image imgtmp = createImage(ims)
Graphics g = c_imgArea.getGraphics()
g.drawImage(imgtmp, 0, 0, null)
}
public void setImageData(byte [][][] imgData, int xsize, int ysize)
{
System.out.println("SIZE = "+xsize+"x"+ysize)
int newArray [] = new int[xsize*ysize]
int pixi = 0
int curpix = 0
short [] currgb = new short[3]
for (int i=0
{
for (int j=0
{
for (int k=0
{
currgb[k] = (short) imgData[k][i][j]
currgb[k] = (currgb[k] < 128) ? (short) currgb[k] : (short) (currgb[k]-256)
}
curpix = (int) currgb[0] * +
((int) currgb[1] * (int) Math.pow(2,8)) +
((int) currgb[2] * (int) Math.pow(2,16))
if (pixi % 1000 == 0) System.out.println("PIXI = "+pixi+" "+curpix)
newArray[pixi++] = curpix
}
}
MemoryImageSource ims = new MemoryImageSource(xsize, ysize, newArray, 0, ysize)
c_imgArea.setImageObj(c_imgArea.createImage(ims))
}
public byte[][][] getImageData()
{
int width = 1
int height = 1
PixelGrabber pGrab
width = m_xsize
height = m_ysize
// pixarray for the grab - 3D bytearray for display
int [] pixarray = new int[width*height]
byte [][][] bytearray = new byte[3][width][height]
// create a pixel grabber
pGrab = new PixelGrabber(c_imgArea.getImageObj(),0,0, width,height, pixarray, 0, width)
// grab the pixels from the image
try
{
boolean b = pGrab.grabPixels()
}
catch (InterruptedException e)
{
System.err.println("pixel grab interrupted")
return bytearray
}
// break down the 32-bit integers from the grab into 8-bit bytes
// and fill the return 3D array
int pixi = 0
int curpix = 0
for (int j=0
{
for (int i=0
{
curpix = pixarray[pixi++]
bytearray[0][i][j] = (byte) ((curpix >> 16) & 0xff)
bytearray[1][i][j] = (byte) ((curpix >> 8) & 0xff)
bytearray[2][i][j] = (byte) ((curpix ) & 0xff)
}
}
return bytearray
}
public static void main(String [] args)
{
FrameTest f = new FrameTest()
}
}
Note: The above text is for the FrameTest class that accesses the glowing_gas.jpg file in the examples/data directory of a default installation of IDL on a Windows system. The file’s location is specified as c:\\ITT\\IDL70\\EXAMPLES\\DATA in the above text. If the glowing_gas.jpg file is not in the same location on system, edit the text to change the location of this file to match your system.
The FrameTest class uses two other user-defined classes, RSIImageArea and RSIImageAreaResizeListener. These classes help to define the viewing area and display the image in Java. Copy and paste the following text into a file, then save it as RSIImageArea.java:
import javax.swing.*
import java.awt.*
import java.awt.event.*
import java.util.Vector
import java.io.File
public class RSIImageArea extends JComponent implements MouseMotionListener, MouseListener
{
Image c_img
int m_boxw = 100
int m_boxh = 100
Dimension c_dim
boolean m_pressed = false
int m_button = 0
Vector c_resizelisteners = null
public RSIImageArea(String imgFile, Dimension dim)
{
c_img = getToolkit().getImage(imgFile)
c_dim = dim
setPreferredSize(dim)
setSize(dim)
addMouseMotionListener(this)
addMouseListener(this)
}
public void addResizeListener(RSIImageAreaResizeListener l)
{
if (c_resizelisteners == null) c_resizelisteners = new Vector()
if (! c_resizelisteners.contains(l)) c_resizelisteners.add(l)
}
public void removeResizeListener(RSIImageAreaResizeListener l)
{
if (c_resizelisteners == null) return
if (c_resizelisteners.contains(l)) c_resizelisteners.remove(l)
}
public void displayImage()
{
repaint()
}
public void paint(Graphics g)
{
int xsize = c_img.getWidth(null)
int ysize = c_img.getHeight(null)
if (xsize != -1 && ysize != -1)
{
if (xsize != c_dim.width || ysize != c_dim.height)
{
c_dim.width = xsize
c_dim.height = ysize
setPreferredSize(c_dim)
setSize(c_dim)
if (c_resizelisteners != null)
{
RSIImageAreaResizeListener l = null
for (int j=0
{
l = (RSIImageAreaResizeListener)
c_resizelisteners.elementAt(j)
l.areaResized(xsize, ysize)
}
}
}
}
g.drawImage(c_img, 0, 0, null)
}
public void setImageFile(String fileName)
{
c_img = null
c_img = getToolkit().getImage(fileName)
repaint()
}
public Image getImageObj()
{
return c_img
}
public void setImageObj(Image img)
{
c_img = img
repaint()
}
public void drawZoomBox(MouseEvent e)
{
int bx = e.getX() - m_boxw/2
bx = (bx >=0) ? bx :0
int by = e.getY() - m_boxh/2
by = (by >=0) ? by :0
int ex = bx + m_boxw
if (ex > c_dim.width)
{
ex = c_dim.width
bx = c_dim.width-m_boxw
}
int ey = by + m_boxh
if (ey > c_dim.height)
{
ey = c_dim.height
by = c_dim.height-m_boxh
}
repaint()
Graphics g = getGraphics()
g.drawImage(c_img, bx, by, ex, ey, bx+(m_boxw/4), by+(m_boxh/4), ex-(m_boxw/4),ey-(m_boxh/4), null)
g.setColor(Color.white)
g.drawRect(bx, by, m_boxw, m_boxh)
}
public void mouseDragged(MouseEvent e)
{
drawZoomBox(e)
}
public void mouseMoved(MouseEvent e)
{
Graphics g = getGraphics()
if (m_pressed && (m_button == 1))
{
drawZoomBox(e)
g.setColor(Color.white)
g.drawString("DRAG", 10,10)
}
else
{
g.setColor(Color.white)
String s = "("+e.getX()+","+e.getY()+")"
repaint()
g.drawString(s, e.getX(), e.getY())
}
}
public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mousePressed(MouseEvent e)
{
m_pressed = true
m_button = e.getButton()
repaint()
if (m_button == 1) drawZoomBox(e)
}
public void mouseReleased(MouseEvent e)
{
m_pressed = false
m_button = 0
}
}
And copy and paste the following text into a file, then save it as RSIImageAreaResizeListener.java:
public interface RSIImageAreaResizeListener
{
public void areaResized(int newx, int newy)
}
Compile these classes in Java. Then either update the jbexamples.jar file in the resource/bridges/import/java directory with the new compiled class, place the resulting compiled classes in your Java class path, or edit the JVM Classpath setting in the IDL-Java bridge configuration file to specify the location (path) of these compiled classes. See Location of the Bridge Configuration File for more information.
With the Java classes compiled, you can now access them in IDL. Copy and paste the following text into the IDL Editor window, then save it as ImageFromJava.pro:
PRO ImageFromJava
oJSwing = OBJ_NEW('IDLjavaObject$FrameTest', 'FrameTest')
image = oJSwing -> GetImageData()
PRINT, 'Loaded Image Information:'
HELP, image
IIMAGE, image
END
After compiling the above routine, you can run it in IDL. This routine produces the following Java Swing application.
Then, the routine produces the following iImage tool.
Note: After IDL starts the Java Swing application, the two displays are independent of each other. If a new image is loaded into the Java application, the IDL iImage tool is not updated. If the iImage tool modifies the existing image or opens a new image, the Java Swing application is not updated.