Also ich habs jetzt so gemacht:
[Java]
private void saveFrameAsPNG(String fileName ) {
// Open File
if( fileName == null ) {
fileName = new String( "Screenshot.png" );
}
File outputFile = new File( fileName );
try {
javax.imageio.ImageIO.write( takeScreenshot(), "PNG", outputFile );
} catch (Exception e) {
System.out.println( "Error: ImageIO.write." );
e.printStackTrace();
}
}
private BufferedImage takeScreenshot(){
int frameWidth = Display.getDisplayMode().getWidth();
int frameHeight = Display.getDisplayMode().getHeight();
BufferedImage screenshot = null;
// allocate space for RBG pixels
ByteBuffer fb = ByteBuffer.allocateDirect(frameWidth*frameHeight*3);
int[] pixels = new int[frameWidth * frameHeight];
int bindex;
// grab a copy of the current frame contents as RGB
GL11.glReadPixels(0, 0, frameWidth, frameHeight, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, fb);
// convert RGB data in ByteBuffer to integer array
for (int i=0; i < pixels.length; i++) {
bindex = i * 3;
pixels = ((fb.get(bindex) << 16)) + ((fb.get(bindex+1) << 8)) + ((fb.get(bindex+2) << 0));
}
// Create a BufferedImage with the RGB pixels then save as PNG
try {
screenshot = new BufferedImage(frameWidth, frameHeight, BufferedImage.TYPE_INT_RGB);
screenshot.setRGB(0, 0, frameWidth, frameHeight, pixels, 0, frameWidth);
// * Flip Image Y Axis *
AffineTransform tx = AffineTransform.getScaleInstance(1, -1);
tx.translate(0, -screenshot.getHeight(null));
AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
screenshot = op.filter(screenshot, null);
}
catch (Exception e) {
System.out.println("ScreenShot() exception: " +e);
}
return screenshot;
}
[/Java]
Nicht schön... aber selten. Jedenfalls bekomme ich in iMove damit smooth 30FPS. Damit bin ich mehr als zufrieden. Übrigens ist da noch ein Bug, wenn man die Hintergrund Farbe von Display auf (0,1,0) stellt (also schön helles Greenscreen Grün), dann speichert er das Grün als Gelb. Erst wenn man (0.1,1,0.1) verwendet, dann speichert er das Grün als Grün. Weiß jemand warum?
Weiß jemand wie ich die Bilder zu einem Mov zusammensetze (evt. mit Quicktime for Java, oder besser noch nativ irgendwie)? Denn bisher muss ich die Einzelbilder in iPhoto laden, dann in iMovie, und in iMovie als Film exportieren (Apple Intermediate), dann wieder zur weiteren Greenscreen Anwendung nochmals als Film einladen. Naja, etwas umständlich :lol: