2016-12-29 4 views
5

Ich habe ein ziemlich seltsames Verhalten beim Screenshot meiner Desktop-Anwendung in LibGDX festgestellt. Ich habe ein kleines Programm erstellt, um diesen "Bug" zu reproduzieren, der nur einen schwarzen Hintergrund und ein rotes Rechteck darstellt. Diese Bilder sind die Ergebnisse:LibGDX screenshot merkwürdiges Verhalten

enter image description hereenter image description here

Die linke ein Screenshot aus dem Fenster auf dem Bildschirm Beschneidungswerkzeug ist, das ist, was es sieht aus wie das Programm ausgeführt wird. Das Recht stammt vom Screenshot-Code, den ich etwas weiter unten gepostet habe. Zur Klarstellung möchte ich, dass der Screenshot des Programms das Ergebnis des linken Bildes liefert, ohne dass die Transparenz merkwürdig wird.

Dies ist mein Render-Code, die Koordinaten nicht kümmern. Da ich sehen kann, dass das Rechteck perfekt gerendert wird, macht es für mich keinen Sinn, dass der Fehler in der Rendermethode ist. Aber ich poste es trotzdem.

@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); 

} 

Dies ist der Code einen Screenshot zu nehmen:

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; 
} 

ich mich diese topic nur ging und recherchiert, gefunden, das genau gleiches Problem. Es hat etwas weniger Informationen und keine Antwort. Ich hoffe, dass jemand von euch dieses Geheimnis beantworten kann.

+0

Es ist kein Fehler. Der Screenshot aus Code enthält, was auch immer Alpha im Back-Buffer zu der Zeit ist, die zur Laufzeit auf dem Bildschirm nicht sichtbar ist, da Sie ein undurchsichtiges Fenster haben. – Tenfour04

+0

Hm, ist das so. Weißt du, es zu reparieren? – Squiddie

+0

Verwenden Sie ein vordefiniertes Alpha, zeichnen Sie zu einem FrameBuffer und zeichnen Sie dann den FrameBuffer zum Abblenden mit dem Bildschirm, oder ersetzen Sie das Alpha jedes Pixels in der Pixmap manuell, bevor Sie es speichern. – Tenfour04

Antwort

3

Meine Frage 23. Februar 2017 von Tenfour04 beantwortet wurde, aber als er in der Veröffentlichung seiner Lösung als Antwort kein Interesse zeigt, ich tue es diesen Thread zu lösen. Vielen Dank an ihn. Was ich tat, war jedes vierte Element (der Alpha-Wert) in der ByteBuffer von getPixels() zu (byte) 255 (undurchsichtig) zurück gesetzt war mein Ergebnis:

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; 
} 
+0

Vielen Dank. Ich hatte gerade das gleiche Problem. :) – Joschua