OnPreviewFrame данных изображения в imageView

Я пытаюсь получить байт [] из предварительного просмотра камеры, преобразовать его в растровое изображение и отобразить его на изображении с помощью imageView.setImageBitmap()

Мне удалось запустить предварительный просмотр и отобразить его на SurfaceView, но я не знаю, как преобразовать данные byte[] (которые, я думаю, в формате Yuv) в растровое изображение RGB, чтобы отобразить его в imageView.

код, который я пытаюсь, следующий:

camera = camera.open();
parameters = camera.getParameters();
camera.setParameters(parameters);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
camera.setPreviewDisplay(surfaceHolder);
camera.setPreviewCallback(this);
camera.startPreview();

и обратный вызов предварительного просмотра это

@Override
public void onPreviewFrame(byte[] data, Camera camera) {

    Camera.Parameters parameters = camera.getParameters();
    int width = parameters.getPreviewSize().width;
    int height = parameters.getPreviewSize().height;
    ByteArrayOutputStream outstr = new ByteArrayOutputStream();
    Rect rect = new Rect(0, 0, width, height); 
    YuvImage yuvimage=new YuvImage(data,ImageFormat.NV21,width,height,null);
    yuvimage.compressToJpeg(rect, 100, outstr);
    Bitmap bmp = BitmapFactory.decodeByteArray(outstr.toByteArray(), 0, outstr.size());
    imgView1.setImageBitmap(bmp);        
}

Предварительный просмотр работает, но imageView остается пустым

Любая идея?

1 ответ

Возможно, вы не открыли камеру в потоке пользовательского интерфейса. Однако вы должны убедиться, что setImageBitmap вызывается в потоке пользовательского интерфейса:

@Override
public void onPreviewFrame(final byte[] data, Camera camera) {
    Camera.Parameters parameters = camera.getParameters();
    int width = parameters.getPreviewSize().width;
    int height = parameters.getPreviewSize().height;

    YuvImage yuv = new YuvImage(data, parameters.getPreviewFormat(), width, height, null);

    ByteArrayOutputStream out = new ByteArrayOutputStream();
    yuv.compressToJpeg(new Rect(0, 0, width, height), 50, out);

    byte[] bytes = out.toByteArray();
    final Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);

    MyActivity.this.runOnUiThread(new Runnable() {

        @Override
        public void run() {
            ((ImageView) findViewById(R.id.loopback)).setImageBitmap(bitmap);
        }
    });
}
Другие вопросы по тегам