5

ScreenUtils.getFrameBufferPixels(...)ゲーム画面のスクリーンショットを撮るために使用しています。このメソッドによって返されたバイト配列を画像としてファイルに保存したいと考えています。私はlibGDXを使用しており、アンドロイドに焦点を当てています。

4

2 に答える 2

4

今ではかなり簡単です。Libgdx はを提供します。

機能させるには、1 つのステートメントを追加する必要がありました。イメージを に直接保存できませんでした/screenshot1.png。単純に先頭に追加しGdx.files.getLocalStoragePath()ます。

ソースコード:

public class ScreenshotFactory {

    private static int counter = 1;
    public static void saveScreenshot(){
        try{
            FileHandle fh;
            do{
                fh = new FileHandle(Gdx.files.getLocalStoragePath() + "screenshot" + counter++ + ".png");
            }while (fh.exists());
            Pixmap pixmap = getScreenshot(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), false);
            PixmapIO.writePNG(fh, pixmap);
            pixmap.dispose();
        }catch (Exception e){           
        }
    }

    private static Pixmap getScreenshot(int x, int y, int w, int h, boolean yDown){
        final Pixmap pixmap = ScreenUtils.getFrameBufferPixmap(x, y, w, h);

        if (yDown) {
            // Flip the pixmap upside down
            ByteBuffer pixels = pixmap.getPixels();
            int numBytes = w * h * 4;
            byte[] lines = new byte[numBytes];
            int numBytesPerLine = w * 4;
            for (int i = 0; i < h; i++) {
                pixels.position((h - i - 1) * numBytesPerLine);
                pixels.get(lines, i * numBytesPerLine, numBytesPerLine);
            }
            pixels.clear();
            pixels.put(lines);
        }

        return pixmap;
    }
}
于 2014-06-28T11:14:01.363 に答える
3

ここの libGDX フォーラム メンバーによって提供された最小限の .PNG エンコーダーで幸運に恵まれました: http://www.badlogicgames.com/forum/viewtopic.php?p=8358#p8358

エンコーダーは非常に単純化されているため、結果の PNG は最適化されていないことに注意してください (pngcrush オフラインを使用してサイズを大幅に縮小しました)。

アルファチャンネルにも問題がありました。下にある画面の色は、画面上の透明なピクセルを通して表示されますが、画面から削り取られたピクセルには表示されません (したがって、これは実際には PNG エンコーダーの障害ではありません)。背景が黒の場合は、アルファ チャネルがピクセル単位で 1.0 であることを確認してください (もちろん、スクリーンショットで透明度が必要な場合を除きます)。

于 2012-10-05T22:26:50.630 に答える