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;
}
}