Android переключение с ImageView на SurfaceView - PullRequest
0 голосов
/ 29 мая 2020

Я написал приложение Android, которое отображает кадры, поступающие с удаленной ИК-камеры на ImageView. Приложение отлично работает еще и потому, что частота кадров ИК-камеры довольно низкая (9 Гц), а также разрешение ( 160x120), но с другой камерой оба должны увеличиваться. Читая вокруг, я вижу, что для повышения производительности следует использовать компонент SurfaceView вместо ImageView. Это метод, который я использую для обновления содержимого ImageView:

private void frameReady(byte[] image_data) {
    final int[] bmp_data = NormalizeBmp(image_data, IR_FRAME_WIDTH, IR_FRAME_HEIGHT, videoPolarity);

    final Bitmap bitmap = Bitmap.createBitmap(bmp_data, IR_FRAME_WIDTH, IR_FRAME_HEIGHT, Bitmap.Config.ARGB_8888);
    videoView.setImageBitmap(bitmap);
}

Чтобы обновить SurfaceView, мне нужно использовать метод draw(), который принимает только объект Canvas, тогда frameReady становится чем-то вот так:

private void frameReady(byte[] image_data) {
    final int[] bmp_data = NormalizeBmp(image_data, IR_FRAME_WIDTH, IR_FRAME_HEIGHT, videoPolarity);

    final Bitmap bitmap = Bitmap.createBitmap(bmp_data, IR_FRAME_WIDTH, IR_FRAME_HEIGHT, Bitmap.Config.ARGB_8888);

    final Canvas canvas = new Canvas();
    canvas.drawBitmap(bitmap,0,0, null);
    videoView.draw(canvas);
}

К сожалению, это не работает: нет ошибок или исключений, просто растровое изображение не отображается.

Я не знаю, есть ли более эффективный способ достичь тот же результат. Если у кого-то есть подсказка, ответьте .

Другая проблема возникает из-за следующего метода:

public void takeSnapshot() {
    Bitmap image = ((BitmapDrawable) videoView.getDrawable()).getBitmap();

    assert image != null;

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_hh_mm_ss", Locale.getDefault());
    String name = camera.network + "_" + camera.name.replaceAll("\\s+", "") + "_" + sdf.format(new Date()) + ".jpg";

    Activity activity = getActivity();
    assert activity != null;
    Utils.saveImage(activity.getContentResolver(), image, name, null);
    Log.info("takeSnapshot: " + name);

    MediaActionSound sound = new MediaActionSound();
    sound.play(MediaActionSound.SHUTTER_CLICK);

    String msg = String.format(getString(R.string.image_saved), getString(R.string.app_name));
    Toast toast = Toast.makeText(getActivity(), msg, Toast.LENGTH_SHORT);
    toast.show();
}

Это было получение растрового изображения, нарисованного на ImageView, и сохранение Это. Я погуглил, но не нашел способа получить изображенный кадр из SurfaceView. У кого-то есть подсказки?

...