
import java.awt.image.BufferedImage;
import java.awt.Dimension;
import java.io.File;
import java.io.FileOutputStream;
import javax.imageio.ImageIO;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.View;
import javax.media.j3d.ImageComponent;
import javax.media.j3d.ImageComponent2D;
import javax.media.j3d.Screen3D;

public class CanvasToJPEG
{
   Canvas3D           onScreenCanvas;
   Canvas3D  offscreencanvas;

   public CanvasToJPEG( Canvas3D onscreen, Canvas3D offscreen )
   {
      onScreenCanvas = onscreen;
      offscreencanvas = offscreen;
   }
   public void toJPEG( File file, View view )
   {
      view.addCanvas3D( offscreencanvas );
      view.stopView();
      view.renderOnce();
      view.startView();
      doIt( file );
      view.removeCanvas3D( offscreencanvas );
   }
   protected void doIt( File file )
   {
      Dimension dSize = computeSize();

      BufferedImage bImage = new BufferedImage(
            dSize.width, dSize.height, BufferedImage.TYPE_INT_ARGB);
      ImageComponent2D buffer = new ImageComponent2D(
            ImageComponent.FORMAT_RGBA, bImage);
      buffer.setCapability(ImageComponent2D.ALLOW_IMAGE_READ);

      offscreencanvas.setOffScreenBuffer( buffer );
      offscreencanvas.renderOffScreenBuffer();

      long t0 = System.currentTimeMillis();

      offscreencanvas.waitForOffScreenRendering();

      long t1 = System.currentTimeMillis();

      System.out.println( t1-t0 );

      BufferedImage bImageRet = offscreencanvas.
                                  getOffScreenBuffer().
                                     getImage();
      try {
         FileOutputStream out = new FileOutputStream( file );
         ImageIO.write( bImageRet, "jpeg", out );
      } catch( Exception e)
      {
         System.out.println( e );
      }
   }
   protected Dimension computeSize()
   {
      Screen3D onScreen = onScreenCanvas.getScreen3D();
      Dimension dSize = onScreen.getSize();
      Screen3D offScreen = offscreencanvas.getScreen3D();
      offScreen.setSize( dSize );
      offScreen.setPhysicalScreenWidth( onScreen.getPhysicalScreenWidth() );
      offScreen.setPhysicalScreenHeight(onScreen.getPhysicalScreenHeight());
      return dSize;
   }
}

