Abel,

You can use offscreen rendering to capture the image and then write the
offscreen buffer to a file. Here is an example.

-Charmaine Lee
Java3D Engineering Team




> MIME-Version: 1.0
> Date: Wed, 7 Feb 2001 10:01:27 -0800
> From: Abel Castellanos <[EMAIL PROTECTED]>
> Subject: [JAVA3D] Image question
> To: [EMAIL PROTECTED]
>
> How can I saved to .JPG or .Gif file a image from the Canvas3D?
>
> __________________________________________________
> Do You Yahoo!?
> Yahoo! Auctions - Buy the things you want at great prices.
> http://auctions.yahoo.com/
>
> ===========================================================================
> To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
> of the message "signoff JAVA3D-INTEREST".  For general help, send email to
> [EMAIL PROTECTED] and include in the body of the message "help".
/*
 *      @(#)PrintFromButton.java 1.5 99/10/27 12:57:47
 *
 * Copyright (c) 1996-1999 Sun Microsystems, Inc. All Rights Reserved.
 *
 * Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
 * modify and redistribute this software in source and binary code form,
 * provided that i) this copyright notice and license appear on all copies of
 * the software; and ii) Licensee does not utilize the software in a manner
 * which is disparaging to Sun.
 *
 * This software is provided "AS IS," without a warranty of any kind. ALL
 * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
 * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
 * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
 * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
 * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
 * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
 * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
 * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
 * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGES.
 *
 * This software is not designed or intended for use in on-line control of
 * aircraft, air traffic, aircraft navigation or aircraft communications; or in
 * the design, construction, operation or maintenance of any nuclear
 * facility. Licensee represents and warrants that it will not use or
 * redistribute the Software for such purposes.
 */

import com.sun.j3d.utils.geometry.ColorCube;
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.behaviors.mouse.MouseRotate;

/**
 * PrintFromButton tests renderOffScreenBuffer from a button
 */
public class PrintFromButton extends Applet implements ActionListener {

  OffScreenCanvas3D c;

  public BranchGroup createSceneGraph(Raster drawRaster)
  {
    // Create the root of the branch graph
    BranchGroup objRoot = new BranchGroup();

    // spin object has composited transformation matrix
    Transform3D spin = new Transform3D();
    Transform3D tempspin = new Transform3D();

    spin.rotX(Math.PI/4.0d);
    tempspin.rotY(Math.PI/5.0d);
    spin.mul(tempspin);
    spin.setScale(0.7);
    spin.setTranslation(new Vector3d(-0.4, 0.3, 0.0));

    TransformGroup objTrans = new TransformGroup(spin);
    objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
    objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
    MouseRotate mouse = new MouseRotate(objTrans);
    mouse.setSchedulingBounds(new BoundingSphere(new Point3d( 0.0, 0.0, 0.0 ), 1000));
    objRoot.addChild(mouse);
    objRoot.addChild(objTrans);

    // Create a simple shape leaf node, add it to the scene graph.
    // ColorCube is a Convenience Utility class
    objTrans.addChild(new ColorCube(0.4));

    //Create a raster obj
    Shape3D shape = new Shape3D(drawRaster);
    objRoot.addChild(shape);

    // Let Java 3D perform optimizations on this scene graph.
    objRoot.compile();

    return objRoot;
  }

  public PrintFromButton ()
  {
    setLayout(new BorderLayout());
    GraphicsConfiguration config =
       SimpleUniverse.getPreferredConfiguration();

    BufferedImage bImage = new BufferedImage(
                                200, 200 , BufferedImage.TYPE_INT_ARGB);

    ImageComponent2D buffer = new ImageComponent2D(
                                ImageComponent.FORMAT_RGBA, bImage);
    buffer.setCapability(ImageComponent2D.ALLOW_IMAGE_READ);

    Raster drawRaster = new Raster(
                new Point3f(0.0f, 0.0f, 0.0f), Raster.RASTER_COLOR,
                0, 0, 200, 200, buffer, null);

    drawRaster.setCapability(Raster.ALLOW_IMAGE_WRITE);

    // create the main scene graph
    BranchGroup scene = createSceneGraph(drawRaster);

    // create the on-screen canvas
    Canvas3D d = new Canvas3D(config, false);
    add("Center", d);

    // create a simple universe
    SimpleUniverse u = new SimpleUniverse(d);

    // This will move the ViewPlatform back a bit so the
    // objects in the scene can be viewed.
    u.getViewingPlatform().setNominalViewingTransform();


    // create an off Screen Buffer

    c = new OffScreenCanvas3D(config, true);

    // set the offscreen to match the onscreen
    Screen3D sOn = d.getScreen3D();
    Screen3D sOff = c.getScreen3D();
    sOff.setSize(sOn.getSize());
    sOff.setPhysicalScreenWidth(sOn.getPhysicalScreenWidth());
    sOff.setPhysicalScreenHeight(sOn.getPhysicalScreenHeight());

    // attach the same view to the offscreen canvas
    u.getViewer().getView().addCanvas3D(c);

    // create the gui
    Button b = new Button ("Print");
    b.addActionListener(this);
    Panel p = new Panel();
    p.add(b);
    add("North", p);

    u.addBranchGraph(scene);

  }

  public void actionPerformed(ActionEvent e)
  {
    // perform the print action
    c.print();
  }

  public static void main(String argv[])
  {
    new MainFrame(new PrintFromButton(), 500, 500);
  }
}
import java.io.*;
import java.text.*;
import com.sun.image.codec.jpeg.*;
import sun.awt.image.codec.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.event.*;
import javax.media.j3d.*;
import javax.vecmath.*;


class OffScreenCanvas3D extends Canvas3D {

  boolean printing = false;

  public OffScreenCanvas3D(GraphicsConfiguration gconfig, boolean offscreenflag) {

    super(gconfig, offscreenflag);
  }

  public void print() {

    if(!printing) {

       printing = true;

      BufferedImage bImage = new BufferedImage(
                                  200, 200 , BufferedImage.TYPE_INT_RGB);

      ImageComponent2D buffer = new ImageComponent2D(
                                  ImageComponent.FORMAT_RGB, bImage);

      this.setOffScreenBuffer(buffer);
      this.renderOffScreenBuffer();
    }
  }

  public void postSwap() {

    if (printing) {
      super.postSwap();
      drawOffScreenBuffer();
      printing = false;
    }
  }

  void drawOffScreenBuffer() {
    ImageComponent2D ic = this.getOffScreenBuffer();
    writeImage(System.currentTimeMillis()+".jpg", ic.getImage());
  }

  public void writeImage (String fileName, BufferedImage bi)
  {
    try {
      createDir (fileName);
      File file = new File(fileName);
      FileOutputStream out = new FileOutputStream(file);
      JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
      JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bi);
      param.setQuality(1.0f, false);
      encoder.setJPEGEncodeParam(param);
      encoder.encode(bi);
      out.close();
    }
    catch (Exception ex) {
      System.out.println ("Error writing image to file " + fileName +
                           ": " + ex.toString());
      ex.printStackTrace();
    }
  }

  public boolean createDir (String fileName)
  {
    int i = fileName.lastIndexOf ('\\');
    if (i > -1) {
      String dir = fileName.substring (0, i);
      File f = new File (dir);
      System.out.println ("mkdir: " + dir);
      return f.mkdirs(); // creates all dirs in file's pathname
    }
    return true;
  }

}

Reply via email to