Как наложить изображение или изображение поверх снимка, снятого камерой
Что я делаю, это рисовать изображение с камеры на 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 обрезается на обоих изображениях, предлагают ему просто простую проблему масштабирования.
Надеюсь, что это поможет!