मुझे लिबजीडीएक्स में अपने डेस्कटॉप एप्लिकेशन को स्क्रीनशॉट करने का एक अजीब व्यवहार सामना करना पड़ा। मैंने इस "बग" को पुन: पेश करने के लिए एक छोटा सा कार्यक्रम बनाया जो केवल एक काला पृष्ठभूमि और एक लाल आयताकार प्रस्तुत करता है।लिबजीडीएक्स स्क्रीनशॉट अजीब व्यवहार
बाईं एक खिड़की की स्क्रीन क्लिपिंग उपकरण से एक स्क्रीनशॉट जा रहा है, यह क्या यह कार्यक्रम चलाने की तरह लग रहा है: उन छवियों परिणाम हैं। सही स्क्रीनशॉट कोड से है जो मैंने थोड़ा और नीचे पोस्ट किया है। स्पष्टीकरण के लिए, मैं प्रोग्राम के स्क्रीनशॉट को बाएं छवि के परिणाम प्राप्त करने के लिए चाहता हूं, पारदर्शिता बिना सभी अजीब हो रही है।
यह मेरा प्रस्तुत कोड है, निर्देशांक को ध्यान में रखें। चूंकि मैं आयत को पूरी तरह से प्रस्तुत किया जा सकता हूं, इसलिए यह रेंडर विधि में त्रुटि के लिए मुझे कोई समझ नहीं आता है। लेकिन मैं इसे वैसे भी पोस्ट कर रहा हूं।
@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 पाया है, जो वास्तव में एक ही समस्या है। हालांकि, इसमें थोड़ी कम जानकारी है और कोई जवाब नहीं है। मुझे आशा है कि आप में से कोई भी इस रहस्य का उत्तर दे सकता है।
यह एक बग नहीं है: क्या मैंने किया था
ByteBuffer
में हर चौथे तत्व (अल्फा मूल्य)(byte) 255
(अपारदर्शी) कोgetPixels()
द्वारा दिया यह मेरा परिणाम था स्थापित करने के लिए किया गया था। कोड से स्क्रीनशॉट में उस समय बैक बफर में जो भी अल्फा है, जो रनटाइम पर स्क्रीन पर दिखाई नहीं दे रहा है क्योंकि आपके पास एक अपारदर्शी विंडो है। – Tenfour04एचएम, ऐसा है। क्या आप इसे ठीक करने के बारे में जानते हैं? – Squiddie
प्रीमिलीप्लाइड अल्फा का उपयोग करें, फ़्रेमबफर पर खींचे और फिर फ्रेमबफर को ब्लेंडिंग के साथ स्क्रीन पर खींचें, या इसे सहेजने से पहले प्रत्येक पिक्सेल के अल्फा को मैन्युअल रूप से प्रतिस्थापित करें। – Tenfour04