Libgdx - 截图质量差

时间:2014-12-21 20:09:40

标签: java android libgdx screenshot alpha

我尝试根据这篇文章制作游戏的屏幕截图: https://github.com/libgdx/libgdx/wiki/Taking-a-Screenshot

在PNG转换中发现黑色有问题。

我的截图如下:

  • 应该是:

enter image description here

  • 是:

enter image description here

以下是详细视图:

enter image description here

叶子周围有一种奇怪的颜色而不是阴影。

有没有人有类似的问题?

1 个答案:

答案 0 :(得分:3)

我通过实现特定于平台的机制解决了这个问题 - 它对于Android和桌面应用程序来说是不同的。

您可以在libgdx here中找到有关平台特定代码的更多信息。

这是android的界面:

public interface ScreenshotPixmap {
    public void saveScreenshot(FileHandle fileHandle);
}

并实施:

public class AndroidScreenshotPixmap implements ScreenshotPixmap {

public Pixmap getScreenshot( int x, int y, int w, int h, boolean flipY ) {

    Gdx.gl.glPixelStorei( GL20.GL_PACK_ALIGNMENT, 1 );

    final Pixmap pixmap = new Pixmap( w, h, Pixmap.Format.RGBA8888 );
    ByteBuffer pixels = pixmap.getPixels();
    Gdx.gl.glReadPixels( x, y, w, h, GL20.GL_RGBA, GL20.GL_UNSIGNED_BYTE, pixels );

    final int numBytes = w * h * 4;
    byte[] lines = new byte[numBytes];
    if ( flipY ) {
        final 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 );
    } else {
        pixels.clear();
        pixels.get( lines );
    }

    return pixmap;
}

public int[] pixmapToIntArray( Pixmap pixmap ) {
    int w = pixmap.getWidth();
    int h = pixmap.getHeight();

    int dest = 0;
    int[] raw = new int[w * h];
    for ( int y = 0; y < h; y++ ) {
        for ( int x = 0; x < w; x++ ) {
            int rgba = pixmap.getPixel( x, y );
            raw[dest++] = 0xFF000000 | ( rgba >> 8 );
        }
    }
    return raw;
}

public void savePNG( int[] colors, int width, int height, OutputStream stream ) {
    Bitmap bitmap = Bitmap.createBitmap( colors, width, height, Bitmap.Config.ARGB_8888 );
    bitmap.compress( Bitmap.CompressFormat.PNG, 100, stream );
}

@Override
public void saveScreenshot(FileHandle fileHandle) {
    Pixmap pixmap = getScreenshot(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), false);
    OutputStream stream = fileHandle.write(false);
    savePNG(pixmapToIntArray(pixmap), Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), stream);
}
}
祝你好运。