写真を撮影した後にギャラリーを見て気づいたのですが、画像のデータがおかしい事に気づきました。
撮影時に指定した範囲よりも大きい写真がとれていました。カメラの解像度と、画面の解像度の違いから発生がしているようです。
今回は撮影している範囲を画面内に抑えてみようかと思います。
カメラのサイズの変更をしていると思われる部分は
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height){ Camera.Parameters parameters = myCamera.getParameters(); parameters.setPreviewSize(width, height); myCamera.setParameters(parameters); myCamera.startPreview(); }
でした。setPreviewSize()で値を指定しているようでしたが値を変更しても、サイズ画像が歪むなどが記載されておりました。
また。値を設定しない方がよい。ようです。(下記リンクを参照)
なので
parameters.setPreviewSize(width, height);
を消してしまいます。
そうすると、画面の大きさに合わせて、カメラのプレビューの比率が変わってしまいます。
ここで仮定をしたのですが、「カメラのプレビュー自体はSurfaceView全体に広がる仕様」なのかと思いました。
なので、surfaceViewをカメラの解像度に合わせた比率に変更をすれば、プレビューも解像度にあったサイズに変更されるのではないか。。と。
android.view.ViewGroup.LayoutParams lp = getLayoutParams(); lp.width = 100; lp.height = 100; setLayoutParams( lp );
としたら、カメラのプレビューのサイズが100×100になりました。仮定は正しかったようです。
つまりは、カメラの比率に合わせて、SurfaceViewを画面いっぱいに広がる形でに変更をしてみました。
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height){ Camera.Parameters parameters = myCamera.getParameters(); android.view.ViewGroup.LayoutParams lp = getLayoutParams(); int ch = parameters.getPreviewSize().height; int cw = parameters.getPreviewSize().width; if(ch/cw > height/width){ lp.width = width; lp.height = width*ch/cw; }else{ lp.width = height*cw/ch; lp.height = height; } setLayoutParams( lp ); myCamera.setParameters(parameters); myCamera.startPreview(); }
これで、画面には撮影時に取得できる構図で、表示できるようになりました。
以上です。