如何使用LWJGL制作简单的截图方法?

时间:2012-12-11 11:06:58

标签: screenshot rgb lwjgl javax.imageio glreadpixels

所以基本上我现在一直在搞乱LWJGL,我突然停下来,带着glReadPixels()的烦恼。
为什么它只能从左下方读取 - >右上角。
所以我在这里回答我自己的问题,因为我想出了所有这些东西,我希望我的发现对其他人有用。

作为我正在使用的附注:

glOrtho(0, WIDTH, 0 , HEIGHT, 1, -1);

2 个答案:

答案 0 :(得分:3)

所以这里是我的屏幕捕获代码,可以在任何LWJGL应用程序C:

中实现
//=========================getScreenImage==================================//
    private void screenShot(){
             //Creating an rbg array of total pixels
             int[] pixels = new int[WIDTH * HEIGHT];
             int bindex;
             // allocate space for RBG pixels
             ByteBuffer fb = ByteBuffer.allocateDirect(WIDTH * HEIGHT * 3);

             // grab a copy of the current frame contents as RGB
             glReadPixels(0, 0, WIDTH, HEIGHT, GL_RGB, GL_UNSIGNED_BYTE, fb);

             BufferedImage imageIn = new BufferedImage(WIDTH, HEIGHT,BufferedImage.TYPE_INT_RGB);
             // convert RGB data in ByteBuffer to integer array
             for (int i=0; i < pixels.length; i++) {
                 bindex = i * 3;
                 pixels[i] =
                     ((fb.get(bindex) << 16))  +
                     ((fb.get(bindex+1) << 8))  +
                     ((fb.get(bindex+2) << 0));
             }
             //Allocate colored pixel to buffered Image
             imageIn.setRGB(0, 0, WIDTH, HEIGHT, pixels, 0 , WIDTH);

             //Creating the transformation direction (horizontal)
             AffineTransform at =  AffineTransform.getScaleInstance(1, -1);
             at.translate(0, -imageIn.getHeight(null));

             //Applying transformation
             AffineTransformOp opRotated = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR);
             BufferedImage imageOut = opRotated.filter(imageIn, null);

             try {//Try to screate image, else show exception.
                 ImageIO.write(imageOut, format , fileLoc);
             }
             catch (Exception e) {
                 System.out.println("ScreenShot() exception: " +e);
             }
         }

我希望这很有用。
如有任何关于代码的问题或意见,请随意询问/建议。 C:
拥抱,
玫瑰

答案 1 :(得分:1)

对于迟到的回复感到抱歉,但这适用于仍在寻找解决方案的任何人。

public static void saveScreenshot() throws Exception {
    System.out.println("Saving screenshot!");
    Rectangle screenRect = new Rectangle(Display.getX(), Display.getY(), Display.getWidth(), Display.getHeight());
    BufferedImage capture = new Robot().createScreenCapture(screenRect);
    ImageIO.write(capture, "png", new File("doc/saved/screenshot.png"));
}