2012-10-02 3 views
1

Java Swing 기술을 사용하여 NetBeans 플랫폼으로 데스크탑 응용 프로그램을 만들었습니다. 해당 응용 프로그램에서 PointArray [] 객체를 사용하여 3D 이미지에서 이미지 처리를 수행합니다.NetBeans 플랫폼 앱에서 Java3D 이미지를 더 빠르게 표시하는 방법은 무엇입니까?

내 응용 프로그램이 Windows 7, 그래픽 카드 및 좋은 RAM 용량 (4GB RAM)이있는 PC에서 실행되면 3DImage 버튼을 클릭 한 후 5 ~ 6 초 내에 내 3D 이미지가 만들어지고 표시됩니다. 그러나 내 응용 프로그램이 Windows XP, 낮은 그래픽 구성의 PC에서 실행될 때 내 3D 이미지는 렌더링하는 데 최대 3 분이 걸리고 이미지를 표시하지 않는 시간이 걸립니다. 그러면 어떻게 그 문제를 해결할 수 있을까요?

내 코드는 다음과 같습니다.

import com.sun.j3d.utils.behaviors.mouse.MouseRotate; 
import com.sun.j3d.utils.behaviors.mouse.MouseWheelZoom; 
import com.sun.j3d.utils.universe.SimpleUniverse; 
import java.awt.BorderLayout; 
import java.awt.GraphicsConfiguration; 
import java.awt.image.BufferedImage; 
import javax.media.j3d.Appearance; 
import javax.media.j3d.BoundingSphere; 
import javax.media.j3d.BranchGroup; 
import javax.media.j3d.Canvas3D; 
import javax.media.j3d.ColoringAttributes; 
import javax.media.j3d.GeometryArray; 
import javax.media.j3d.PointArray; 
import javax.media.j3d.PointAttributes; 
import javax.media.j3d.Shape3D; 
import javax.media.j3d.TransformGroup; 
import javax.media.jai.JAI; 
import javax.media.jai.PlanarImage; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.vecmath.Color3f; 
import javax.vecmath.Point3d; 
import javax.vecmath.Point3f; 


public final class FinalDImage extends JPanel { 

    private static int s = 0, count = 0, r = 0, g = 0, b = 0, medHeight = 0, medWidth = 0; 
    private static float divisior1 = 300000.0f; 
    private static Shape3D plShape; 
    private static TransformGroup objRotate; 
    private static BranchGroup scene; 
    private static JButton btn; 
    private static Canvas3D canvas3D; 
    private static SimpleUniverse simpleU; 
    private static GraphicsConfiguration gc; 
    private static BufferedImage histImage; 
    private static JPanel jPanel1 = new JPanel(); 

    public FinalDImage(BufferedImage histImage) { 
     FinalDImage.histImage = histImage; 
     medWidth = (int) (histImage.getWidth()/2.0f); 
     medHeight = (int) (histImage.getHeight()/2.0f); 
     this.add(jPanel1); 
     initComponents(); 
    } 

    public void initComponents() { 
     setLayout(new BorderLayout()); 
     btn = new JButton("Intensity"); 
     gc = SimpleUniverse.getPreferredConfiguration(); 
     canvas3D = new Canvas3D(gc);//See the added gc? this is a preferred config 
     add("Center", canvas3D); 
     add(btn, BorderLayout.SOUTH); 
     scene = createSceneGraph(FinalDImage.histImage); 
     scene.setCapability(BranchGroup.ALLOW_DETACH); 
     scene.compile(); 
     simpleU = new SimpleUniverse(canvas3D); 
     simpleU.getViewingPlatform().setNominalViewingTransform(); 
     simpleU.addBranchGraph(scene); 
    } 

    public BranchGroup createSceneGraph(BufferedImage histImage) { 
     count = 0; 
     BranchGroup lineGroup = new BranchGroup(); 
     Appearance app = new Appearance(); 
     ColoringAttributes ca = new ColoringAttributes(new Color3f(204.0f, 204.0f, 204.0f), ColoringAttributes.SHADE_FLAT); 
     app.setColoringAttributes(ca); 

     Point3f plaPts; 
     Color3f color; 
     PointArray pla = new PointArray(histImage.getWidth() * histImage.getHeight(), GeometryArray.COLOR_3 | GeometryArray.COORDINATES); 

     if (histImage.getType() == 11) { 
      for (int i = histImage.getWidth() - 3; i >= 3; i--) { 
       for (int j = histImage.getHeight() - 3; j >= 3; j--) { 
        s = histImage.getRaster().getSample(i, j, 0); 
        plaPts = new Point3f((medWidth - i)/1500.0f, 
             (medHeight - j)/1500.0f, 
             s/divisior1); 
        color = new Color3f(s/60000.0f, s/60000.0f, s/60000.0f); 
        pla.setCoordinate(count, plaPts); 
        pla.setColor(count, color); 
        count++; 
       } 
      } 
     } else { 
      for (int i = 2; i < histImage.getWidth() - 2; i++) { 
       for (int j = 2; j < histImage.getHeight() - 2; j++) { 
        r = histImage.getRaster().getSample(i, j, 0); 
        g = histImage.getRaster().getSample(i, j, 1); 
        b = histImage.getRaster().getSample(i, j, 2); 
        s = (r + g + b)/3; 
        plaPts = new Point3f((medWidth - i)/1200.0f, 
             (medHeight - j)/1200.0f, 
             s/(divisior1/600.0f)); 
        color = new Color3f(r/300.0f, g/300.0f, b/300.0f); 
        pla.setCoordinate(count, plaPts); 
        pla.setColor(count, color); 
        count++; 
       } 
      } 
     } 


     PointAttributes a_point_just_bigger = new PointAttributes(); 
     a_point_just_bigger.setPointSize(4.0f);//10 pixel-wide point 
     a_point_just_bigger.setPointAntialiasingEnable(true); //now points are sphere-like (not a cube) 
     app.setPointAttributes(a_point_just_bigger); 
     plShape = new Shape3D(pla,app); 
     objRotate = new TransformGroup(); 
     objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); 
     objRotate.addChild(plShape); 
     lineGroup.addChild(objRotate); 
     MouseRotate myMouseRotate = new MouseRotate(); 
     myMouseRotate.setFactor(0.015, 0.015); 
     myMouseRotate.setTransformGroup(objRotate); 
     myMouseRotate.setSchedulingBounds(new BoundingSphere()); 
     myMouseRotate.setSchedulingBounds(new BoundingSphere(
       new Point3d(0.0, 0.0, 0.0), 100)); 

     lineGroup.addChild(myMouseRotate); 
     MouseWheelZoom mz = new MouseWheelZoom(); 
     mz.setFactor(0.01); 
     mz.setTransformGroup(objRotate); 
     mz.setSchedulingBounds(new BoundingSphere()); 
     lineGroup.addChild(mz); 
     return lineGroup; 
    } 

    public static void main(String[] args) { 
     PlanarImage plImg3 = JAI.create("fileload", "E:\\Data\\office\\teeth3.tiff"); 
     BufferedImage histImage = plImg3.getAsBufferedImage(); 
     JFrame frame = new JFrame(); 
     frame.add(new JScrollPane(new FinalDImage(histImage))); 
     frame.setSize(800, 700); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 

답변

1

이것은 java3D 버전 문제입니다. 내 코드는 괜찮아. 하지만 java3d는 해당 OS의 그래픽 configuration.now에 적합하지 않습니다. Diretecx와 함께 다른 java3d를 설치하고 잘 작동합니다.

관련 문제