Делание снимка экрана Android OpenGL

Я пытаюсь сделать снимок экрана Android OpenGL.

Код, который я нашел, следующие:

nt size = width * height;
    ByteBuffer buf = ByteBuffer.allocateDirect(size * 4);
    buf.order(ByteOrder.nativeOrder());
    glContext.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
    }

Я попробовал также код из того текста ссылки сайта

В каждом случае результатом является png файл, который является абсолютно черным. Я нашел, что существует некоторая проблема с glReadPixels метод, но я не знаю, как обойти его.

20
задан Kara 24 February 2015 в 18:41
поделиться

1 ответ

Понятно!

Моя ошибка заключалась в том, что я запомнил контекст GL в переменной класса. Чтобы сделать снимок экрана, я должен использовать контекст gl, переданный в OnDraw в классе, реализующем интерфейс GLSurfaceView.Renderer. Я просто использую свой код в предложении «if», и все работает, как ожидалось. Надеюсь, это замечание поможет кому-нибудь.

С уважением, Гордон

2
ответ дан 30 November 2019 в 00:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: