带有滤镜的Android相机预览

时间:2015-04-24 04:11:14

标签: java android colors filter camera

我有一个CameraPreview课程。它扩展了SurfaceView并实现了SurfaceHolder.CallbackPreviewCallback。我想更改相机发送到SurfaceView的图像。它应该在代码的以下部分中完成:

@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
};

1 个答案:

答案 0 :(得分:0)

不,您无法更改SurfaceView相机预览。 onPreviewFrame()回调独立于在曲面上绘制相机预览而发生。您可以使用另一个视图覆盖曲面,这可能会掩盖它。如果您的操作很简单,则可以使用TextureView,并在从相机接收的纹理上应用一些OpenGL着色器。但通常我们只是隐藏实时预览并在操作后推送onPreviewFrame()中收到的数据