2015-04-24 3 views
4

У меня есть класс CameraPreview. Он расширяет SurfaceView и реализует SurfaceHolder.Callback и PreviewCallback. Я хотел бы изменить изображение, которое камера отправляет на SurfaceView. Это должно быть сделано в следующей части кода:Предварительный просмотр камеры Android с цветным фильтром

@Override 
public void onPreviewFrame(byte[] data, Camera camera) { 
    Log.d(TAG, "onPreviewFrame"); 
    Canvas canvas = mHolder.lockCanvas(); 
    synchronized (mHolder) { 
     Paint p = new Paint(); 
     p.setColor(Color.RED); 
     canvas.drawRect(0, 0, 100, 200, p); 
     mHolder.unlockCanvasAndPost(canvas); 
    } 
} 

Но я получаю следующее исключение:

Exception locking surface java.lang.IllegalArgumentException at android.view.Surface.nativeLockCanvas(Native Method) at android.view.Surface.lockCanvas(Surface.java:243)

Google говорит, что встретилась ошибка из-за разблокированного холста, но я всегда оставляю он заблокирован. Как я могу нарисовать изображение на SurfaceView?

Я создаю функцию, которая применяет цветовой фильтр с существующим изображением, я надеюсь, что этот код верен.

@Override 
protected void overDraw(Canvas canvas) {   
    Paint p = new Paint(); 
    ColorMatrixColorFilter fl = new ColorMatrixColorFilter(new ColorMatrix(filter)); 
    p.setColorFilter(fl); 
    canvas.drawPaint(p); 
    Log.d(TAG, "overDraw"); 
} 

float[] filter = new float[] 
{ 
    //r, g, b, a, k 
    0.33,0.33,0.33,0,0, //r 
    0.33,0.33,0.33,0,0, //g 
    0.33,0.33,0.33,0,0, //b 
    0,0,0,1,0, //a 
}; 

ответ

0

Нет, вы не можете изменить предварительный просмотр камеры SurfaceView. Обратный вызов onPreviewFrame() происходит независимо от рисования предварительного просмотра камеры на поверхности. Вы можете наложить поверхность на другой вид, который может замаскировать его. Если ваша манипуляция проста, вы можете использовать TextureView вместо этого и применять некоторые шейдеры OpenGL на текстуре, полученной с камеры. Но обычно мы просто скрываем предварительный просмотр в прямом эфире и нажимаем данные, полученные в onPreviewFrame() после манипуляций.

Смежные вопросы