Here is how you can get a .png screenshot of an OpenGL image on Android:
// GL10 gl;
// int width, height;
int size = width * height;
ByteBuffer buf = ByteBuffer.allocateDirect(size * 4);
buf.order(ByteOrder.nativeOrder());
gl.glReadPixels(0, 0, width, height, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, buf);
int data[] = new int[size];
buf.asIntBuffer().get(data);
buf = null;
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
bitmap.setPixels(data, size-width, -width, 0, 0, width, height);
data = null;
short sdata[] = new short[size];
ShortBuffer sbuf = ShortBuffer.wrap(sdata);
bitmap.copyPixelsToBuffer(sbuf);
for (int i = 0; i < size; ++i) {
//BGR-565 to RGB-565
short v = sdata[i];
sdata[i] = (short) (((v&0x1f) << 11) | (v&0x7e0) | ((v&0xf800) >> 11));
}
sbuf.rewind();
bitmap.copyPixelsFromBuffer(sbuf);
try {
FileOutputStream fos = new FileOutputStream("/sdcard/screeshot.png");
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
fos.flush();
fos.close();
} catch (Exception e) {
// handle
}
{ 2 } Comments
Hi! This is great! Very helpful! But I have one question – how I can get transparent background of this screenshot? I have gl view with transparent background on top of my camera view so now I need to get my OpenGL object with transparent background instead of black.
Thank you.
Thank you!
For the commenter above… try and set the Bitmap object pixel format to something which supports an Alpha channel. RGBA_4444 or RGBA_8888 etc.
Bitmap.createBitmap(width, height, Bitmap.Config.RGBA_4444;
Post a Comment