Skip to content

Android: OpenGL ES screenshot

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

  1. Alex Bush | 2011-01-19 at 03:45 | Permalink

    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.

  2. Mark England | 2011-06-15 at 21:48 | Permalink

    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

Your email is never published nor shared. Required fields are marked *