デスクトップアプリケーションをLibGDXでスクリーンショットするというかなり奇妙な動作に遭遇しました。黒い背景と赤い長方形だけをレンダリングするこの「バグ」を再現するために、小さなプログラムを作り直しました。これらの画像は結果です:
左側はウィンドウの画面クリッピングツールのスクリーンショットで、これはプログラムを実行しているように見えます。右は、少し下に投稿したスクリーンショットコードからのものです。明確にするために、透明度がすべて奇妙になることなく、プログラムのスクリーンショットで左の画像の結果を取得する必要があります。
これは私のレンダリングコードです。座標は気にしないでください。長方形が完全にレンダリングされているのを見ることができるので、renderメソッドにエラーがあることは私には意味がありません。とにかく投稿します。
@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;
}
私が行って調べたところ、このトピックしか見つかりませんでした。これはまったく同じ問題です。ただし、情報が少し少なく、答えがありません。誰かがこの謎に答えてくれることを願っています。
私の質問は2017年2月23日にTenfour04によって回答されましたが、彼は自分の解決策を回答として投稿することに興味を示さないため、このスレッドを解決するためにそれを行っています。彼に心から感謝します。私がしたことは、4つおきの要素(アルファ値)を(不透明な)にByteBuffer
返すことでした。これが私の結果でした。getPixels()
(byte) 255
private static Pixmap getScreenshot(int x, int y, int width, int height) {
final Pixmap pixmap = ScreenUtils.getFrameBufferPixmap(x, y, width, height);
ByteBuffer pixels = pixmap.getPixels();
for(int i = 4; i < pixels.limit(); i += 4) {
pixels.put(i - 1, (byte) 255);
}
int numBytes = width * height * 4;
byte[] lines = new byte[numBytes];
int numBytesPerLine = width * 4;
for(int i = 0; i < height; i++) {
pixels.position((height - i - 1) * numBytesPerLine);
pixels.get(lines, i * numBytesPerLine, numBytesPerLine);
}
pixels.clear();
pixels.put(lines);
pixels.clear();
return pixmap;
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加