狠狠撸

狠狠撸Share a Scribd company logo
ANDROID HACKS #30  カメラを使う 担当:  Tatsuki Higashi Twitter : @htk16 09/19/11
この資料について この資料は下記の本をベースに勉強会で作成した資料です。 『 Android Hacks 』(株式会社ブリリアントサービス著、オライリー?ジャパン刊) この本の紹介ページが下記にあります。 http://www.oreilly.co.jp/books/9784873114569/ 09/19/11
アジェンダ カメラからの情報を取得する カメラの画像を画面に表示する Hack をさらに Hack する カメラの画像をファイルに保存する (写真を撮る) プレビュー画像を取得する 09/19/11
0.  始める前に 自分の環境だけかもしれないが, Hack30 のサンプルはそのまま ビルドできませんでした. -> src ディレクトリ以下の .svn ディレクトリを削除して対応 09/19/11
1.  カメラからの情報を取得する 09/19/11
1.  カメラからの情報を取得 カメラを使えるようにする AndroidManifest.xml  の manifest タグに以下を追加 <uses-permission android:name= &quot;android.permission.CAMERA&quot; /> 必要ならば,カメラの機能を有効にする <uses-feature android:name=&quot;android.hardware.camera&quot; /> <uses-feature android:name=&quot;android.hardware.camera.autofocus&quot; /> 前者はカメラを使うならば必要? 09/19/11
1.  カメラからの情報を取得 カメラ利用の流れ Camera.open:  カメラのインスタンス取得 Camera.getParameter:  カメラの各種パラメータ取得 Camera.Parameter  型でパラメータを返す Camera.setParameter:  必要ならば,パラメータ変更  Camera.setCameraOrientation:  必要ならば,角度の補正 Camera.setPreviewDisplay :  初期化された  SurfaceHolder  を渡す これをやらないと preview ができない Camera.startPreview :  カメラの映像で  Surface を更新し始める Camera.stopPreview: preview を停止する Camera.release :  カメラを返却する 09/19/11
1.  カメラからの情報を取得 解像度を変更する Camera.Parameter.setPreviewSize(int width, int height) Camera.getParameter  でカメラのパラメータを取得 Camera.Parameter.setPreviewSize でパラメータ変更 Camera.setParameter  で変更したパラメータを設定 Activity のサイズ変更に追従して変更する場合は 以下の callback メソッド内で行うのが良い Activity.surfaceChanged(SurfaceHolder h, int format,   int width, int height) 09/19/11
1.  カメラからの情報を取得 SurfaceHolder 4 種類の surface が利用可 SURFACE_TYPE_GPU GPU 描画に対応した surface  非推奨 SURFACE_TYPE_HARDWARE DMA 転送に対応したハードウェア surface  非推奨 SURFACE_TYPE_NORMAL 通常(?)の surface SURFACE_TYPE_PUSH_BUFFERS buffer を持たない surface  カメラで使うのはこの種類 SurfaceHolder.addCallback callback interface になる activity などを追加する 09/19/11
1.  カメラからの情報を取得 CameraPreview (例 30-1  29 ? 79) SurfaceView の派生クラス コンストラクタで  SurfaceHolder を作成し, CameraPreview をその callback interface として登録 CameraPreview.surfaceCreated カメラに preview surface を与える CameraPreview.surfaceChanged カメラの解像度を変更 CameraPreview.surfaceDestroyed 後始末 MainActivity  ( 例 30-1 13 ? 74 ) onCreate で CameraPreview のインスタンスを ContentView として指定 09/19/11
2. Hack をさらに Hack する -  カメラ画像をファイルに保存 09/19/11
2.  カメラ画像を保存 カメラ利用の流れ カメラのインスタンス取得 カメラの各種パラメータ取得 必要ならば,パラメータ変更  必要ならば,角度の補正 初期化された  SurfaceHolder  を渡す カメラの映像で  Surface を更新し始める 画像をキャプチャする Camera.takePicture :  静止画像を取得 Camera.startPreview:  カメラの更新を再開 preview を停止する カメラを返却する 09/19/11
2.  カメラ画像を保存 Camera.takePicture(Camera.ShutterCallback shutter,  Camera.PictureCallback raw, Camera.PictureCallback postview, Camera.PictureCallback jpeg) shutter:  シャッターが押されたときの callback interface Camera.ShutterCallback.onShutter raw:  処理前画像を取得したときの callback interface Camera.ShutterCallback.onPictureTaken postview: postview image  を取得したときの interface ? 基本的には null を与える jpeg: jpeg 画像を取得した際の  callback interface Camera.ShutterCallback.onPictureTaken 09/19/11
2.  カメラ画像を保存 Camera.ShutterCallback.onPictureTaken(byte[] data,   Camera cam) data: raw の callback interface  なら未処理画像,      jpeg なら jpeg 圧縮された画像のバイナリデータ 09/19/11
2.  カメラ画像を保存 jpeg 画像のキャプチャ  ( 図 30-2) MainWithShutterActivity.onTouchEvent  ( 図 30-2 77 ? 90) 画面を押し込んだなら画面をキャプチャ Camera.takePicture でキャプチャ shutter, raw には何もしない interface を与える jpeg には画像をファイルに書き出す interface を与える Camera.startPreview で preview を再開 画面の押し込み以外のイベントならデフォルトの処理を行う 09/19/11
3.  プレビュー画像を取得する 09/19/11
3.  プレビュー画像を取得する Camera.setPreviewCallback(Camera.PrevieCallback cb): カメラがプレビュー画像を取得した時に呼ばれる callback interface を指定する Camera.PreviewCallback.onPreviewFrame(byte[] data,    Camera cam) プレビューが更新されたときに呼ばれる data:  プレビュー画像  (YUV420SP 形式) Bitmap 画像の保存  ( 図 30-3) プレビューが更新されるたびにその画像をメモリ上に保持 画面がタッチされたら保持しているデータから bitmap 画像を作成 この処理は時間がかかるので,別スレッドで実行 09/19/11
参考 URL Android Developers | Camera http://developer.android.com/reference/android/hardware/Camera.html 09/19/11

More Related Content

Android Hacks - Hack30

  • 1. ANDROID HACKS #30 カメラを使う 担当: Tatsuki Higashi Twitter : @htk16 09/19/11
  • 2. この資料について この資料は下記の本をベースに勉強会で作成した資料です。 『 Android Hacks 』(株式会社ブリリアントサービス著、オライリー?ジャパン刊) この本の紹介ページが下記にあります。 http://www.oreilly.co.jp/books/9784873114569/ 09/19/11
  • 3. アジェンダ カメラからの情報を取得する カメラの画像を画面に表示する Hack をさらに Hack する カメラの画像をファイルに保存する (写真を撮る) プレビュー画像を取得する 09/19/11
  • 4. 0. 始める前に 自分の環境だけかもしれないが, Hack30 のサンプルはそのまま ビルドできませんでした. -> src ディレクトリ以下の .svn ディレクトリを削除して対応 09/19/11
  • 6. 1. カメラからの情報を取得 カメラを使えるようにする AndroidManifest.xml の manifest タグに以下を追加 <uses-permission android:name= &quot;android.permission.CAMERA&quot; /> 必要ならば,カメラの機能を有効にする <uses-feature android:name=&quot;android.hardware.camera&quot; /> <uses-feature android:name=&quot;android.hardware.camera.autofocus&quot; /> 前者はカメラを使うならば必要? 09/19/11
  • 7. 1. カメラからの情報を取得 カメラ利用の流れ Camera.open: カメラのインスタンス取得 Camera.getParameter: カメラの各種パラメータ取得 Camera.Parameter 型でパラメータを返す Camera.setParameter: 必要ならば,パラメータ変更 Camera.setCameraOrientation: 必要ならば,角度の補正 Camera.setPreviewDisplay : 初期化された SurfaceHolder を渡す これをやらないと preview ができない Camera.startPreview : カメラの映像で Surface を更新し始める Camera.stopPreview: preview を停止する Camera.release : カメラを返却する 09/19/11
  • 8. 1. カメラからの情報を取得 解像度を変更する Camera.Parameter.setPreviewSize(int width, int height) Camera.getParameter でカメラのパラメータを取得 Camera.Parameter.setPreviewSize でパラメータ変更 Camera.setParameter で変更したパラメータを設定 Activity のサイズ変更に追従して変更する場合は 以下の callback メソッド内で行うのが良い Activity.surfaceChanged(SurfaceHolder h, int format, int width, int height) 09/19/11
  • 9. 1. カメラからの情報を取得 SurfaceHolder 4 種類の surface が利用可 SURFACE_TYPE_GPU GPU 描画に対応した surface 非推奨 SURFACE_TYPE_HARDWARE DMA 転送に対応したハードウェア surface 非推奨 SURFACE_TYPE_NORMAL 通常(?)の surface SURFACE_TYPE_PUSH_BUFFERS buffer を持たない surface カメラで使うのはこの種類 SurfaceHolder.addCallback callback interface になる activity などを追加する 09/19/11
  • 10. 1. カメラからの情報を取得 CameraPreview (例 30-1 29 ? 79) SurfaceView の派生クラス コンストラクタで SurfaceHolder を作成し, CameraPreview をその callback interface として登録 CameraPreview.surfaceCreated カメラに preview surface を与える CameraPreview.surfaceChanged カメラの解像度を変更 CameraPreview.surfaceDestroyed 後始末 MainActivity ( 例 30-1 13 ? 74 ) onCreate で CameraPreview のインスタンスを ContentView として指定 09/19/11
  • 11. 2. Hack をさらに Hack する - カメラ画像をファイルに保存 09/19/11
  • 12. 2. カメラ画像を保存 カメラ利用の流れ カメラのインスタンス取得 カメラの各種パラメータ取得 必要ならば,パラメータ変更 必要ならば,角度の補正 初期化された SurfaceHolder を渡す カメラの映像で Surface を更新し始める 画像をキャプチャする Camera.takePicture : 静止画像を取得 Camera.startPreview: カメラの更新を再開 preview を停止する カメラを返却する 09/19/11
  • 13. 2. カメラ画像を保存 Camera.takePicture(Camera.ShutterCallback shutter, Camera.PictureCallback raw, Camera.PictureCallback postview, Camera.PictureCallback jpeg) shutter: シャッターが押されたときの callback interface Camera.ShutterCallback.onShutter raw: 処理前画像を取得したときの callback interface Camera.ShutterCallback.onPictureTaken postview: postview image を取得したときの interface ? 基本的には null を与える jpeg: jpeg 画像を取得した際の callback interface Camera.ShutterCallback.onPictureTaken 09/19/11
  • 14. 2. カメラ画像を保存 Camera.ShutterCallback.onPictureTaken(byte[] data, Camera cam) data: raw の callback interface なら未処理画像,     jpeg なら jpeg 圧縮された画像のバイナリデータ 09/19/11
  • 15. 2. カメラ画像を保存 jpeg 画像のキャプチャ ( 図 30-2) MainWithShutterActivity.onTouchEvent ( 図 30-2 77 ? 90) 画面を押し込んだなら画面をキャプチャ Camera.takePicture でキャプチャ shutter, raw には何もしない interface を与える jpeg には画像をファイルに書き出す interface を与える Camera.startPreview で preview を再開 画面の押し込み以外のイベントならデフォルトの処理を行う 09/19/11
  • 17. 3. プレビュー画像を取得する Camera.setPreviewCallback(Camera.PrevieCallback cb): カメラがプレビュー画像を取得した時に呼ばれる callback interface を指定する Camera.PreviewCallback.onPreviewFrame(byte[] data, Camera cam) プレビューが更新されたときに呼ばれる data: プレビュー画像 (YUV420SP 形式) Bitmap 画像の保存 ( 図 30-3) プレビューが更新されるたびにその画像をメモリ上に保持 画面がタッチされたら保持しているデータから bitmap 画像を作成 この処理は時間がかかるので,別スレッドで実行 09/19/11
  • 18. 参考 URL Android Developers | Camera http://developer.android.com/reference/android/hardware/Camera.html 09/19/11