Что я делаю, это рисовать изображение с камеры на 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 находится в мертвой середине изображения.
Я фиксирую изображение выше, и оно сохраняется. Я иду посмотреть, и это выглядит так:
Обратите внимание, что Android больше не находится посередине, его в левом верхнем углу.
В качестве другого теста я переместил часть Android на экран, как показано в следующем предварительном просмотре камеры
Я фиксирую изображение точно так, как показано выше, и, просмотрев его, андроид отрезается точно так, как он был в окне предварительного просмотра, но снова его в верхнем левом углу, когда он должен быть полноэкранным