java - 带有滤色器的 Android 相机预览

标签 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);
    }   
}

但我得到以下异常:

异常锁定表面 java.lang.IllegalArgumentException异常 在 android.view.Surface.nativeLockCanvas( native 方法) 在 android.view.Surface.lockCanvas(Surface.java:243)

谷歌说错误发生是因为 Canvas 未锁定,但我总是保持锁定状态。 如何在 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
};

最佳答案

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

关于java - 带有滤色器的 Android 相机预览,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29838572/

相关文章:

java - 使用 Jetty 和 Maven 上传文件

java - 是否可以查看servlet的源代码?

android - MPAndroidChart- 如何在图表表等网格内添加单元格?

替换 bmp 中特定颜色的快速函数崩溃

java - org.springframework.beans.factory.UnsatisfiedDependencyException moskito

android - 从 android 或 ios 上的投币机获取硬币数量

android - 在 Expo : Asyncstorage gets cleared when app refreshes 中 react 原生

css - 在 IE 中更改选项文本颜色

image - 如何通过 opencv 和 python 只保留图像中具有特定颜色的文本?

Java:使用正则表达式 .*-\\d+{.*}\\d+-.* 引发 PatternSyntaxException