Screenshot Problem

Status
Nicht offen für weitere Antworten.

Developer_X

Top Contributor
Bei mir hat das bisher immer funktioniert, warum funktioniert die Screenshot methode jetzt, nicht?


[highlight=Java]
import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.GraphicsConfiguration;
import java.awt.HeadlessException;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.text.NumberFormat;

import javax.imageio.ImageIO;
import javax.media.Manager;
import javax.media.NoPlayerException;
import javax.media.Player;
import javax.media.j3d.AmbientLight;
import javax.media.j3d.Appearance;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.TextureAttributes;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.swing.JFrame;
import javax.vecmath.Color3f;
import javax.vecmath.Color4f;
import javax.vecmath.Point3d;
import javax.vecmath.Vector3d;
import javax.vecmath.Vector3f;
import com.sun.j3d.utils.geometry.Box;
import com.sun.j3d.utils.geometry.Cylinder;
import com.sun.j3d.utils.image.TextureLoader;
import com.sun.j3d.utils.universe.SimpleUniverse;

public class Trailer_3 extends JFrame implements KeyListener
{
float pos = 0;
float pos2 = 0;

SimpleUniverse u;
static Player m_Player;

Vector3f vct;
Transform3D ViewT3D;
TransformGroup ViewTG;

Vector3f vct2;
Transform3D text;
TransformGroup Text;

static int outFileSeq = 0;
static String outFileBase = "ScreenShot.Trailer";
static NumberFormat nf = NumberFormat.getInstance();


class WindowListener extends WindowAdapter{public void windowClosing(WindowEvent e)
{
m_Player.stop();

System.exit(0); }}
public Trailer_3()
{
this.addKeyListener(this);

Toolkit tk = Toolkit.getDefaultToolkit();
final Dimension d = tk.getScreenSize();

setSize(d);
setTitle("R.a.t.r.o.t.c.p.");

setUndecorated(true);

setVisible(true);
setLayout(null);

addWindowListener(new WindowListener());

GraphicsConfiguration config1 = SimpleUniverse.getPreferredConfiguration();
Canvas3D canvas1 = new Canvas3D(config1);
canvas1.setBounds(0,0,d.width,d.height);
u = new SimpleUniverse(canvas1);
u.addBranchGraph(createSceneGraph1());
add(canvas1);

try {
m_Player = Manager.createPlayer(new File("F:/Rayman/Sound.Library/Pirates.mp3").toURL() );
} catch (NoPlayerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
m_Player.start();

warte(34500);
setVisible(false);
m_Player.stop();
}

public BranchGroup createSceneGraph1()
{
BG.compile();
return BG;
}

public static void main(String[]args)
{
try
{
new Trailer_3();

}
catch (Exception e)
{
e.printStackTrace();
}
}
public static void warte(long millis){try{Thread.sleep(millis);}catch(InterruptedException e){}}


public void keyPressed(KeyEvent arg0)
{
if (arg0.getKeyCode()== KeyEvent.VK_F1)
{
BufferedImage bi = null;
try {


bi = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
} catch (HeadlessException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (AWTException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

nf.setMaximumFractionDigits(10);
try {
ImageIO.write( bi, "jpg", new File("C:/R.a.t.r.o.t.c.p.-Screens/"+outFileBase + nf.format(outFileSeq++)+".jpg"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

public void keyReleased(KeyEvent arg0) {}
public void keyTyped(KeyEvent arg0) {}
}

[/highlight]
 
es kommt keine Fehlermeldung, das problem ist, wenn ich die Bilder angucke, ist das ein graues Bild, mehr nicht, und das soll es ja nicht sein, ich habe ja auch eine 3D Welt geamacht, und zeige sie an, wieso ist diese nicht zu sehen?
 
Wie wäre es, wenn Du Dir ein Image erstellst, dann dein Canvas3D darauf zeichnen lässt und es abspeicherst?
Ich finde, dass das die beste Methode ist, selbst Screenshots von seinen Anwendungen zu erstellen - und es nicht dem Betriebssystem zu überlassen.
 
und wie bitte schön?
Kannst dus mir bitte erklären wie ich das machen soll, an nem Code oder so?
Ich habe diese Shoot methode doch in meine Keyevent methode drin, ich kanns also net ich public methode einbauen
 
und wie bitte schön?
Kannst dus mir bitte erklären wie ich das machen soll, an nem Code oder so?
wie wäre es mit API lesen - Beispiele probieren - und dann bei Problemen Fragen stellen?!
Ich habe diese Shoot methode doch in meine Keyevent methode drin, ich kanns also net ich public methode einbauen
dann mach Dir ein Kopp wie Du das verbindest ...hier hat niemand Ahnung von Deinem Programm

hand, mogel
 
Schau dir am besten mal folgendes an:
-java.awt.Image oder BufferedImage (je nach Bedarf)
-javax.imageio //Kannst Du gebrauchen, um das Image zu speichern

Wie man in Swing/AWT zeichnet solltest Du bereits wissen. Wenn nicht hilft hier dieses Forum weiter.

Folgender Ablauf:
-Image erstellen
-Komponente auf Image zeichnen lassen
-Image speichern (imageio)

Das erst einmal gut durchlesen :rtfm: .

Letzten Endes sind das nur ein paar winzige Zeilen Code, allerdings solltest Du das mit Hilfe dieser Stichpunkte sehr gut selbst lösen können. Wenn nicht kann ich sie auch gerne posten (oder jemand anderes). Allerdings solltest Du erst einmal versuchen, es selbst zu lösen.

Ich habe diese Shoot methode doch in meine Keyevent methode drin, ich kanns also net ich public methode einbauen
Ähm, wieso eigentlich nicht...? Selbstverständlich kannst Du das in eine doScreenShot()-Methode einbauen. Du musst nur dafür sorgen, dass sie dann an geeigneter Stelle aufgerufen wird.
 
Code:
  int outFileSeq = 0;
  String outFileBase = "ScreenShot.Trailer";
  NumberFormat nf = NumberFormat.getInstance();

  BufferedImage bi = null;
        try {                      
            bi = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
        } catch (HeadlessException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (AWTException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    
      nf.setMaximumFractionDigits(10);
        try {
            ImageIO.write( bi, "jpg", new File("C:/R.a.t.r.o.t.c.p.-Screens/"+outFileBase + nf.format(outFileSeq++)+".jpg"));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
Das wird doch darin gemacht oder nicht?
PS:
Mir ist heute aufgefallen, dass ich manchmal ScreenShots schießen kann, und manchmal sich der Java Heap Space meldet, und machmal nur ein graues Bild gespeichert wird, ich wüsste da wirklich nicht mehr weiter
 
Glaub kaum, dass das mit z.B. [highlight=java]BufferedImage bi = new BufferedImage(canvas3d.getWidth(), canvas3d.getHeight(), BufferedImage.TRANSLUCENT);
canvas3d.paint(bi.getGraphics());[/highlight]funktioniert. Soweit ich das nachvollziehen kann, wird der Grafikkontext nur als Platzhalter übergeben. Das bedeutet, Canvas3D verwendet dieses gar nicht, weil 2D-Kontext und zeichnet stattdessen in einen sozusagen "Graphics3D" (also Hardware) Kontext gleicher Grösse und Position. Deswegen wird wahrscheinlich auch hier das BufferedImage schwarz (grau?) bleiben. In GL (also auch in JOGL) gibt es ein Feature, welches sich "Render to Texture" nennt, womit man die Ausgabe von 3D in 2D umleiten kann. Weiss nicht ob es in Java3D etwas ähnliches gibt.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben