2016-12-29 21 views
5

मुझे लिबजीडीएक्स में अपने डेस्कटॉप एप्लिकेशन को स्क्रीनशॉट करने का एक अजीब व्यवहार सामना करना पड़ा। मैंने इस "बग" को पुन: पेश करने के लिए एक छोटा सा कार्यक्रम बनाया जो केवल एक काला पृष्ठभूमि और एक लाल आयताकार प्रस्तुत करता है।लिबजीडीएक्स स्क्रीनशॉट अजीब व्यवहार

enter image description hereenter image description here

बाईं एक खिड़की की स्क्रीन क्लिपिंग उपकरण से एक स्क्रीनशॉट जा रहा है, यह क्या यह कार्यक्रम चलाने की तरह लग रहा है: उन छवियों परिणाम हैं। सही स्क्रीनशॉट कोड से है जो मैंने थोड़ा और नीचे पोस्ट किया है। स्पष्टीकरण के लिए, मैं प्रोग्राम के स्क्रीनशॉट को बाएं छवि के परिणाम प्राप्त करने के लिए चाहता हूं, पारदर्शिता बिना सभी अजीब हो रही है।

यह मेरा प्रस्तुत कोड है, निर्देशांक को ध्यान में रखें। चूंकि मैं आयत को पूरी तरह से प्रस्तुत किया जा सकता हूं, इसलिए यह रेंडर विधि में त्रुटि के लिए मुझे कोई समझ नहीं आता है। लेकिन मैं इसे वैसे भी पोस्ट कर रहा हूं।

@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 पाया है, जो वास्तव में एक ही समस्या है। हालांकि, इसमें थोड़ी कम जानकारी है और कोई जवाब नहीं है। मुझे आशा है कि आप में से कोई भी इस रहस्य का उत्तर दे सकता है।

+0

यह एक बग नहीं है: क्या मैंने किया था ByteBuffer में हर चौथे तत्व (अल्फा मूल्य) (byte) 255 (अपारदर्शी) को getPixels() द्वारा दिया यह मेरा परिणाम था स्थापित करने के लिए किया गया था। कोड से स्क्रीनशॉट में उस समय बैक बफर में जो भी अल्फा है, जो रनटाइम पर स्क्रीन पर दिखाई नहीं दे रहा है क्योंकि आपके पास एक अपारदर्शी विंडो है। – Tenfour04

+0

एचएम, ऐसा है। क्या आप इसे ठीक करने के बारे में जानते हैं? – Squiddie

+0

प्रीमिलीप्लाइड अल्फा का उपयोग करें, फ़्रेमबफर पर खींचे और फिर फ्रेमबफर को ब्लेंडिंग के साथ स्क्रीन पर खींचें, या इसे सहेजने से पहले प्रत्येक पिक्सेल के अल्फा को मैन्युअल रूप से प्रतिस्थापित करें। – Tenfour04

उत्तर

3

मेरा प्रश्न Tenfour04 द्वारा उत्तर दिया गया था 23 वें फ़र, 2017 लेकिन के रूप में वह एक जवाब के रूप में अपने समाधान पोस्टिंग में कोई दिलचस्पी नहीं दिखाता है, मैं इसे इस सूत्र को हल करने के कर रहा हूं। उसके लिए बहुत धन्यवाद।

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

आपको बहुत बहुत धन्यवाद। मुझे बस एक ही समस्या थी। :) – Joschua

संबंधित मुद्दे