Ich benutze ScreenUtils.getFrameBufferPixels(...)
, um einen Screenshot des Spielbildschirms zu machen. Ich möchte das Bytearray speichern, das von dieser Methode als Bild in Datei zurückgegeben wird. Ich benutze libGDX und meinen Fokus auf Android.using ScreenUtils, um screenshot als Bild in libgdx zu speichern
Antwort
Es ist jetzt ziemlich einfach. Libgdx bietet eine example.
Ich musste eine Anweisung hinzufügen, damit es funktioniert. Das Bild konnte nicht direkt unter /screenshot1.png
gespeichert werden. Einfach Gdx.files.getLocalStoragePath()
voranstellen.
Source Code:
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;
}
}
Ich hatte viel Glück mit dem minimalen .PNG Encoder von einem Libgdx Forum Element hier: http://www.badlogicgames.com/forum/viewtopic.php?p=8358#p8358
Beachten Sie, dass die resultierenden PNGs nicht optimiert werden, da der Encoder sehr simpel ist (I offline verwendet pngcrush ihre zu reduzieren Größe dramatisch).
Ich hatte auch einige Probleme mit dem Alpha-Kanal. Die darunter liegende Bildschirmfarbe zeigt sich durch transparente Pixel auf dem Bildschirm, kommt aber nicht in den vom Bildschirm abgekratzten Pixeln zum Vorschein (dies ist also nicht wirklich der Fehler des PNG-Encoders). Wenn Ihr Hintergrund schwarz ist, dann stellen Sie sicher, dass der Alphakanal in den Pixeln 1.0 ist (es sei denn, Sie möchten natürlich die Transparenz im Screenshot).
Libgdx jetzt nativ unterstützt PNG-Dateien zu speichern, finden Sie in der 'PixmapIO.writePNG' Methode: http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/ gdx/Grafiken/PixmapIO.html # writePNG (com.badlogic.gdx.files.FileHandle, com.badlogic.gdx.graphics.Pixmap) –