SurfaceView到位图

时间:2010-09-26 19:50:59

标签: android bitmap surfaceview

我正在尝试将SurfaceView(相机预览)转换为Bitmap,以便即时进行面部检测。我收到的是非空图像,但当我将其显示在视图上时,它看起来是纯黑色的。可能是什么原因以及如何进行?

(我认为从SurfaceView中提取位图很困难但并非不可能 - 但没有人发布任何解决方案)

class BackgroundView extends SurfaceView implements SurfaceHolder.Callback {


        public BackgroundView(Context context) {
            super(context);

                    // ...

            setDrawingCacheEnabled(true);
        }


        // ...
    }

    private Runnable update = new Runnable() {
        public void run() {

                    // Following statement is sending a black/blank image
            faceView.updateFaces(backgroundView.getDrawingCache());
            mHandler.postDelayed(update, (long) (1000));
        }
    };

2 个答案:

答案 0 :(得分:2)

我使用了PreviewCallback:

public void onPreviewFrame(byte [] _data,Camera _camera){

    // data = byte array of the camera preview

}

答案 1 :(得分:0)

我在尝试从VideoView获取视频帧时遇到了类似的问题。我已经尝试了这些标志的各种组合:

   vids[i] = new VideoView(this);
   vids[i].setDrawingCacheEnabled(true);
   vids[i].setWillNotCacheDrawing(false);
   vids[i].setWillNotDraw(false);

...(稍后在另一个View的draw()循环中)

curFrame = vids[0].getDrawingCache();
if (curFrame != null) {
   canvas.drawBitmap(curFrame, null, new RectF(10,y,50,y+50), null);
}

但是“curFrame”位图图像,即使不为null,在调试器中的宽度和高度为-1。它可能是某种DRM实现或某种东西,或仅仅是解码器的限制,但我认为不可能获得视频像素。您的相机可能会更好运 - 您是否尝试过使用setWillNotCacheDrawing()?让我知道它是否有效,因为这是我的后备计划!