Обрабатывать изображение с помощью Android, но выходное изображение странно на определенном устройстве

Я написал демо о камере, которая похожа на ContinuousCaptureActivity графика ( Исходный код ContinuousCaptureActivity.java). Для каждого кадра я добавил несколько операций, помимо рисования кадра на экране.

Я создаю ФБО, затем связываю его и рисую рамку для ФБО. Чтобы проверить изображение, отображаемое в fbo, я считываю данные изображения обратно в RAM, используя pbo, и сохраняю изображение как jpg каждые 50 кадров. Таким образом, я получил файл JPG, но он был масштабирован, картина выглядит следующим образом: введите описание изображения здесь

Я предположил, что матрица из SurfaceTexture вызвала масштабирование, потому что каждый drawFrame() применил эту матрицу. Поэтому я создал еще один fbo и нарисовал кадр первого fbo для этого fbo, затем я сохранил изображение в формате jpg и изображение, как и ожидалось, стало ОК. Посмотрите на это: введите описание изображения здесь

Таким образом, вывод состоит в том, что 2 ничьи восстановят изображение правильно.

Но изображение странное в моем телефоне huawei (модель:huawei MT7-CL00). Посмотри на это: введите описание изображения здесь

Я проверил образ первого fbo с телефоном huawei, он масштабирован, как и ожидалось, но не странно. Так что я думаю, что ошибка произошла в Scecond FBO. Но я не могу понять причину. Кто может дать мне несколько советов?

Некоторые исходники:

определения fbo:

private GlTexture mGlTexture;
private GlFrameBuffer mGlFrameBuffer;
private GlFrameBuffer mGlFrameBuffer1;

Исходные коды классов GlTexture и GlFrameBuffer:

http://www.paste.org/80680

метод bindFbo:

private void bindFBO(int fbo)
{
    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fbo);
    GLES20.glClearColor(0.0F, 0.0F, 0.0F, 0.0F);
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
    SurfaceView sv = (SurfaceView) findViewById(R.id.continuousCapture_surfaceView);
    GLES20.glViewport(0, 0, 640, 480);
}

коды клавиш в drawFrame():

            mDisplaySurface.makeCurrent();
    mCameraTexture.updateTexImage();
    mCameraTexture.getTransformMatrix(mTmpMatrix);

    // Fill the SurfaceView with it.
    SurfaceView sv = (SurfaceView) findViewById(R.id.continuousCapture_surfaceView);
    int viewWidth = 640;
    int viewHeight = 480;
    GLES20.glViewport(0, 0, viewWidth, viewHeight);
    mFullFrameBlit.drawFrame(mTextureId, mTmpMatrix);
    //drawExtra(mFrameNum, viewWidth, viewHeight);
    mDisplaySurface.swapBuffers();


    bindFBO(mGlFrameBuffer.getID());
    mFullFrameBlit.drawFrame(mTextureId, mTmpMatrix);
    bindFBO(mGlFrameBuffer1.getID());
    mFullFrameBlit2d.drawFrame(mGlTexture.getID(), mTmpMatrix);

    String filename = "/sdcard/test/" + System.currentTimeMillis() + ".jpg";
    new File(filename).getParentFile().mkdirs();
    if (mFrameNum % 50 == 0)
    {
        try {
            getPixelFromPBO(viewWidth, viewHeight, filename);
        } 
        catch (Exception e) {
        }
    }

0 ответов

Другие вопросы по тегам