Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Java3d и Web приложение


Автор: oson 25.7.2010, 16:00
Пытаюсь внутри web приложения на томкате сгенерировать BufferedImage при помощи библиотек Java3d.
Библиотеки j3dcore.jar, j3dutils.jar, vecmath.jar кидаю в TOMCAT_HOME/lib
В system32 компа на котором запускается томкат лежат j3dcore-d3d.dll, j3dcore-ogl.dll, j3dcore-ogl-cg.dll, j3dcore-ogl-chk.dll
Код такой

Код


public class CanvasSupplier extends Applet
{
    private BufferedImage bufferedImage;
    
    public void createImage()
    {
        GraphicsConfiguration gc = SimpleUniverse.getPreferredConfiguration();
        Canvas3D cv = new Canvas3D(gc);
        setLayout(new BorderLayout());
        add(cv, BorderLayout.CENTER);
        BranchGroup bg = createSceneGraph();
        bg.compile();
        SimpleUniverse su = new SimpleUniverse(cv);
        Locale locale = new Locale(su);
        su.getViewingPlatform().setNominalViewingTransform();
        su.addBranchGraph(bg);

        bufferedImage = takeScreenshot(cv);
    }

    public BufferedImage takeScreenshot(Canvas3D canvas)
    {
        Screen3D on = canvas.getScreen3D();

        Canvas3D shot = new Canvas3D(canvas.getGraphicsConfiguration(), true);
        canvas.getView().stopView();
        canvas.getView().addCanvas3D(shot);
        canvas.getView().startView();


        Screen3D off = shot.getScreen3D();
        off.setSize(on.getSize());
        off.setPhysicalScreenHeight(on.getPhysicalScreenHeight());
        off.setPhysicalScreenWidth(on.getPhysicalScreenWidth());
        shot.setOffScreenLocation(canvas.getLocationOnScreen());

        BufferedImage bi = new BufferedImage(500, 500, BufferedImage.TYPE_INT_ARGB);
        ImageComponent2D buffer = new ImageComponent2D(ImageComponent.FORMAT_RGBA, bi);
        shot.setOffScreenBuffer(buffer);
        shot.renderOffScreenBuffer();
        shot.waitForOffScreenRendering();
        BufferedImage res = shot.getOffScreenBuffer().getImage();
        canvas.getView().removeCanvas3D(shot);
        return res;

    }

    public BranchGroup createSceneGraph()
    {
        BranchGroup objRoot = new BranchGroup();
        TransformGroup objSpin = new TransformGroup();
        objSpin.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        objRoot.addChild(objSpin);
        objSpin.addChild(new ColorCube(0.4));
          return objRoot;
    }

    public BufferedImage getBufferedImage()
    {
        return bufferedImage;
    }
}


public class Test3dBean extends BaseBean
{
    public BufferedImage getBufferedImage()
    {
       try
        {
         CanvasSupplier canvasSupplier = new CanvasSupplier();
         canvasSupplier.createImage();
         bufferedImage = canvasSupplier.getBufferedImage();

            ImageIO.write(bufferedImage, "png", new File("C:\\image123.png"));
        }
        catch (IOException e)
        {
            System.out.println(e.getMessage());
        }

        return bufferedImage;
    }
   
}



На странице вызывается этот BufferedImage через Servlet.

В общем с Java2D все работает. При попытке сгенерировать таким образом на моменте создания CanvasSupplier extends Applet все тихо замирает - причем никаких ошибок не выдается.
Подскажите плиз, вообще реально так сделать или я чего то не улавливаю? 

Автор: mgarin 26.7.2010, 11:04
Предполагаю, что у апплета нет прав на запись в файл в ОС.
Т.е. повисает на данной строчке:
Код
ImageIO.write(bufferedImage, "png", new File("C:\\image123.png"));


Вы точно уверены что с 2D у вас получалось записать изображение в файл с апплета?

Автор: oson 30.7.2010, 17:11
В общем то получилось записать и Java3d.
В путях системы лежат нужные dll.
В classpath нужные jar. вызываю не как апплет, а как обычный bean внутри web application.
Права записать в файловую систему у него ессно есть и вывести сгенерированный BufferedImage на страницу понятное дело тоже.
Наследование Applet и методы его убрал просто.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)