【问题标题】:Android camera preview with color filter [duplicate]带有滤色器的Android相机预览[重复]
【发布时间】:2015-04-24 04:11:14
【问题描述】:

我有一个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
};

【问题讨论】:

    标签: java android colors filter camera


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多