Как наложить изображение или изображение поверх снимка, снятого камерой

Что я делаю, это рисовать изображение с камеры на canvas, а затем преобразовать view, содержащий изображение, в bitmap и нарисовать его поверх холста. Затем окончательный bitmap сохраняется во внешнем хранилище.

проблема заключается в том, что размер canvas, по-видимому, зависит от размера окна предварительного просмотра, а не от размера сохраненного изображения.

Вот часть моего класса активности, которая объединяет захваченное представление поверх изображения камеры:

        Bitmap myImage = BitmapFactory.decodeByteArray(imageData, 0,
                imageData.length, options);
        Bitmap mutableBitmap = myImage.copy(Bitmap.Config.ARGB_8888, true);

        Paint paint = new Paint();
        Canvas canvas = new Canvas(mutableBitmap);

        view.setDrawingCacheEnabled(true);
        viewCapture = Bitmap.createBitmap(view.getDrawingCache());
        view.setDrawingCacheEnabled(false);
        canvas.drawBitmap(viewCapture, 0, 0, paint);

        fileOutputStream = new FileOutputStream(dir + "/" + imgName + ".jpg");

        BufferedOutputStream bos = new BufferedOutputStream(fileOutputStream);
        mutableBitmap.compress(CompressFormat.JPEG, quality, bos);

Это сохраняет растровое изображение поверх захваченного изображения, но из-за разных размеров его смещение в верхний левый угол.

Я устанавливаю разные размеры, выполняя следующие действия в моем методе surfaceChanged

  Camera.Parameters p = mCamera.getParameters();
  Camera.Size myBestPreviewSize = getBestPreviewSize(w, h, p);
  p.setPreviewSize(myBestPreviewSize.width, myBestPreviewSize.height);
  Camera.Size myBestPictureSize = getBestPictureSize(w, h, p);
  p.setPictureSize(myBestPictureSize.width, myBestPictureSize.height);

Очевидно, делая это, я получаю лучшее разрешение для окна предварительного просмотра и наилучшее разрешение для захваченного изображения. Я считаю, что проблема вызвана двумя разными резолюциями, но выясняется, почему я застрял.

Надеемся, что следующие изображения лучше описывают проблему:

На этом изображении отображаются окна предварительного просмотра. Как вы можете видеть, Android находится в мертвой середине изображения. enter image description here

Я фиксирую изображение выше, и оно сохраняется. Я иду посмотреть, и это выглядит так: enter image description here

Обратите внимание, что Android больше не находится посередине, его в левом верхнем углу.

В качестве другого теста я переместил часть Android на экран, как показано в следующем предварительном просмотре камеры enter image description here

Я фиксирую изображение точно так, как показано выше, и, просмотрев его, андроид отрезается точно так, как он был в окне предварительного просмотра, но снова его в верхнем левом углу, когда он должен быть полноэкранным enter image description here

Ответ 1

Растровые изображения, полученные с камеры, будут массивными (с шириной 2000 пикселей). Ваш SurfaceView, в котором вы рисуете изображение, будет только размером вашего устройства (~ 1000 пикселей в ширину). Когда вы рисуете один на другой, вам нужно масштабировать его, или оно будет в два раза меньше, чем должно быть (как на ваших снимках экрана). Вот как я изменил бы ваш код.

view.setDrawingCacheEnabled(true);
viewCapture = Bitmap.createBitmap(view.getDrawingCache());
view.setDrawingCacheEnabled(false);
//Source Rect sized to the surface view.
Rect src = new Rect(0, 0, viewCapture.getWidth(), viewCapture.getHeight());
//Destination RectF sized to the camera picture
RectF dst = new RectF(0, 0, myImage.getWidth(), myImage.getHeight());
canvas.drawBitmap(viewCapture, src, dst, paint);

Я знаю, что вы делаете некоторые попытки установить параметры и размер камеры, но либо они не работают, либо вам нужно использовать другой подход. Я думаю, что это должно сработать. Вторые скриншоты, в которых парень Android обрезается на обоих изображениях, предлагают ему просто простую проблему масштабирования.

Надеюсь, что это поможет!