我有一个CameraPreview
课程。它扩展了SurfaceView
并实现了SurfaceHolder.Callback
和PreviewCallback
。我想更改相机发送到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)
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 :(得分:0)
不,您无法更改SurfaceView相机预览。 onPreviewFrame()
回调独立于在曲面上绘制相机预览而发生。您可以使用另一个视图覆盖曲面,这可能会掩盖它。如果您的操作很简单,则可以使用TextureView,并在从相机接收的纹理上应用一些OpenGL着色器。但通常我们只是隐藏实时预览并在操作后推送onPreviewFrame()
中收到的数据。