2013-03-07 11 views
11

カメラの画像をcanvasに描画し、画像を含むviewbitmapに変換し、その上に描画します。キャンバス。最後に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); 

これは、撮影した画像の上にビットマップを保存しますが、異なるサイズのために、その左上隅にオフセットされています。

私は

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); 

明らかにこれを実行して、私のsurfaceChangedに以下のようにして、異なるサイズを設定するよ、私は、プレビューウィンドウのための最高の解像度、撮影画像のための最高の解像度を取得しています。私は問題が2つの異なる決議によって引き起こされたと信じていますが、なぜ私が立ち往生しているのかを考え出します。

うまくいけば、次の画像は、より良い問題を説明します:

この画像は、プレビューウィンドウが表示されます。あなたが見ることができるように、Androidはイメージの真ん中にあります。 enter image description here

上記の画像をキャプチャして保存します。私はそれを見に行くと、これはそれがどのように見えるかです: enter image description here

注意してくださいAndroidは、もはや中央の左上隅にあります。次のカメラプレビューに enter image description here

に示すように、別の試験として

、私は上記のように正確に画像をキャプチャし、それを表示する際に、アンドロイドが正確に切断された画面オフアンドロイド途中まで移動しましたプレビューウィンドウにどのように表示されていたのですが、もう一度左上に表示されます。 enter image description here

+0

Sandbox.javaを編集できる場合は、getTransformedBitmap()メソッドを作成できます。新しいBitmapと新しいCanvasを作成し、新しいビットマップをパラメータとして渡すだけでよいでしょう。キャンバスでdraw()を呼び出し、ビットマップを返します。それはview.getDrawingCache()を使うよりもうまくいくかもしれません。 – thomas88wp

+0

@ thomas88wp私はあなたのコメントを何百回も読んでいるに違いない。新しいビットマップを作成するにはどうすればよいですか?私のためにもう少し詳しく説明できますか?あなたの助けに感謝! – Badams

+0

紛らわしいコメントをおかけして申し訳ありません。あなたのスクリーンショットを見て、私はいくつかのコードで別の解決策を提案します(下記参照)。 – thomas88wp

答えて

4

カメラから取り出されたビットマップのサイズは、2000×pxです。画像を描画するSurfaceViewは、デバイスの解像度(〜1000ピクセル幅)と同じ大きさです。あなたが他のものの上に1つを描くとき、​​あなたはそれをスケーリングする必要があります、またはそれはあなたのスクリーンショットのようにするべきであるサイズの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番目のスクリーンショットは、単なるスケーリングの問題であることを示しています。

希望に役立ちます!

+0

まさに私が必要なもの!ありがとうございました! – Badams

+0

ちょっと@Badams、あなたはコードを共有してくださいできます.. :) –

関連する問題