【发布时间】:2017-05-14 01:53:57
【问题描述】:
我在 LibGDX 中截屏我的桌面应用程序时遇到了一个相当奇怪的行为。我重新制作了一个小程序来重现这个只呈现黑色背景和红色矩形的“错误”。这些图像是结果:
左边是window的截屏工具的截图,这是运行程序的样子。右边是我在下面发布的截图代码。澄清一下,我希望程序的屏幕截图能够得到左图的结果,而透明度不会变得很奇怪。
这是我的渲染代码,不要介意坐标。由于我可以看到矩形被完美渲染,因此错误出现在渲染方法中对我来说毫无意义。但无论如何我都会发布它。
@Override
public void render() {
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
Gdx.gl.glActiveTexture(GL20.GL_TEXTURE0);
Gdx.gl.glEnable(GL20.GL_BLEND);
Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
shape.begin(ShapeType.Filled);
shape.setColor(Color.BLACK);
shape.rect(0, 0, 300, 300);
shape.setColor(1f, 0f, 0f, 0.5f);
shape.rect(100, 100, 100, 100);
shape.end();
Gdx.gl.glDisable(GL20.GL_BLEND);
}
这是截图的代码:
public static void screenshot() {
Pixmap pixmap = getScreenshot(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
PixmapIO.writePNG(new FileHandle(Gdx.files.getLocalStoragePath() + "screenshots/test.png"), pixmap);
pixmap.dispose();
}
private static Pixmap getScreenshot(int x, int y, int w, int h) {
final Pixmap pixmap = ScreenUtils.getFrameBufferPixmap(x, y, w, h);
// 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;
}
我去研究了,我只发现了这个topic,这是完全相同的问题。不过,它的信息略少,也没有答案。我希望你们当中有人能解答这个谜题。
【问题讨论】:
-
这不是错误。代码的屏幕截图包括当时后台缓冲区中的任何 alpha,在运行时在屏幕上不可见,因为您有一个不透明的窗口。
-
使用预乘 alpha,绘制到 FrameBuffer,然后在关闭混合的情况下将 FrameBuffer 绘制到屏幕上,或者在保存之前手动替换像素图中每个像素的 alpha。
-
不确切知道您要做什么,但这可能有效。准备截屏的时候,先把混合函数改成GL_ONE,GL_ONE。然后在整个屏幕上绘制一个黑色的不透明矩形。我认为这应该确保 alpha 在任何地方都是一个而不影响颜色(因为黑色的 RGB 为 0,将它添加到您的场景不会改变 RGB,但不透明的颜色意味着您正在为所有内容添加 1 的 alpha)。然后调用你的截图方法拍照。
-
如果您想在截屏后替换 Pixmap 上的任何地方的 alpha,您可以调用
getPixels(),然后将 ByteBuffer 中的每四个字节设置为 (byte)255。但实际上我认为上述方法会更快。
标签: java libgdx screenshot