私がやっていることは、カメラからに画像を描画し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);
明らかにこれを行うことで、プレビューウィンドウに最適な解像度と、キャプチャされた画像に最適な解像度が得られます。この問題は2つの異なる解決策が原因であると思いますが、なぜ私が立ち往生しているのかを理解しています。
うまくいけば、次の画像が問題をよりよく説明します。
この画像はプレビューウィンドウを示しています。ご覧のとおり、Androidは画像の真ん中にあります。
上の画像をキャプチャして保存します。私はそれを見に行きます、そしてこれはそれがどのように見えるかです:
Androidが中央ではなく、左上隅にあることに注意してください。
別のテストとして、次のカメラプレビューに示すように、Androidを画面の途中まで移動しました
上記のように画像を正確にキャプチャし、それを表示すると、Androidはプレビューウィンドウの状態とまったく同じように切り取られますが、フルスクリーンになるはずの場合は左上隅に表示されます。