Обрабатывать изображение с помощью 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:
метод 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) {
}
}