Sto usando ScreenUtils.getFrameBufferPixels(...)
per fare uno screenshot della schermata di gioco. Voglio salvare l'array di byte restituito da questo metodo come un'immagine nel file. Sto usando libGDX e il mio obiettivo in Android.utilizzando ScreenUtils per salvare screenshot come immagine in libgdx
risposta
Ora è abbastanza semplice. Libgdx fornisce uno example.
Ho dovuto aggiungere una dichiarazione per farlo funzionare. L'immagine non può essere salvata direttamente su /screenshot1.png
. Semplicemente anticipato Gdx.files.getLocalStoragePath()
. Codice
Fonte:
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;
}
}
ho avuto buona fortuna con l'encoder .PNG minima fornita da un membro del forum libGDX qui: http://www.badlogicgames.com/forum/viewtopic.php?p=8358#p8358
Nota che i PNG risultanti non sono ottimizzati, come l'encoder è molto semplicistico (io ho usato pngcrush offline per ridurre il loro dimensione drammaticamente).
Ho anche avuto qualche problema con il canale alfa. Il colore dello schermo sottostante viene visualizzato attraverso i pixel trasparenti sullo schermo, ma non viene attraversato dai pixel raschiati dallo schermo (quindi questo non è proprio il difetto dell'encoder PNG). Se il tuo sfondo è nero, assicurati solo che il canale alfa sia 1.0 nei pixel (a meno che tu non voglia la trasparenza nello screenshot, ovviamente).
Libgdx ora supporta nativamente il salvataggio dei file PNG, vedere il metodo 'PixmapIO.writePNG': http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/ gdx/graphics/PixmapIO.html # writePNG (com.badlogic.gdx.files.FileHandle, com.badlogic.gdx.graphics.Pixmap) –