У меня есть класс 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
};