13

私がやっていることは、カメラからに画像を描画し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はプレビューウィンドウの状態とまったく同じように切り取られますが、フルスクリーンになるはずの場合は左上隅に表示されます。 ここに画像の説明を入力してください

4

1 に答える 1

4

カメラから取得したビットマップは膨大になります(幅2000ピクセル以上)。画像を描画するSurfaceViewは、デバイスの解像度(〜1000px幅)と同じ大きさです。一方を他方に描画するときは、拡大縮小する必要があります。そうしないと、(スクリーンショットのように)本来のサイズの1/2になります。これが私があなたのコードを修正する方法です。

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の男が両方の画像にクリップされている2番目のスクリーンショットは、それが単なるスケーリングの問題であることを示しています。

お役に立てば幸いです。

于 2013-03-09T19:54:41.043 に答える