素人のアンドロイドアプリ開発日記

カメラでプレビューと撮影された写真の構図が異なる問題

2011.04.22

写真を撮影した後にギャラリーを見て気づいたのですが、画像のデータがおかしい事に気づきました。

撮影時に指定した範囲よりも大きい写真がとれていました。カメラの解像度と、画面の解像度の違いから発生がしているようです。

今回は撮影している範囲を画面内に抑えてみようかと思います。

カメラのサイズの変更をしていると思われる部分は

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()で値を指定しているようでしたが値を変更しても、サイズ画像が歪むなどが記載されておりました。

また。値を設定しない方がよい。ようです。(下記リンクを参照)

Android カメラアプリ作成メモ(1)

なので

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

これで、画面には撮影時に取得できる構図で、表示できるようになりました。

以上です。

同じカテゴリの記事を紹介します

サイバーエージェントが写真の補正ライブラリ?を公開していますね。Galaxy sでデフォルトのカメラアプリを使った場合のバグカメラをパラメータでもっと魅力的なアプリにする。アンドロイドのカメラアプリを作成するにあたっての雑感。androidの本体のデータベースに登録したのに見れない。(不具合)カメラアプリで歪んだプレビューが表示されてしまう問題カメラアプリでautofocusで実装する。カメラで撮影をして保存してみる。androidでカメラを使ってみる。

カテゴリー:カメラアプリ

公開中のアプリ、是非ダウンロードしてみてください

2chまとめのたね

RSSを利用してさまざまなブログの情報をキュレーションしてくれるアプリ

インストールする

ひらがな戦記

OPENGL ES2 を利用したカルタのソーシャルゲーム

インストールする