Я написал приложение 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
. У кого-то есть подсказки?