2013年2月22日金曜日

iOS アプリで カメラ写真撮影 + 画像保存 を実装してみた


10行くらいで実装できました
実装内容は大きく分けて2つ。
カメラの呼び出しと、撮影した画像の保存。
これだけでした。

逆に言うと、実装したのは基本的なコトだけです。
機能の拡張は後のエントリで行います。

また、カメラ機能は実機でしか試せないようです。
(本エントリの「6.シミュレータで試すとエラーが出ると思います」を参照)。

このエントリの目次
  1. アプリの概要
  2. GitHubにソースを置きました
  3. モーダルビューでカメラを起動する
  4. 撮った写真をカメラロールに保存する
  5. ヘッダファイルに記述するデリゲート
  6. シミュレータで試すとエラーが出ると思います
  7. 参考にさせて頂いたサイト
  8. さいごに

1.アプリの概要
アプリを起動すると、モーダルビューでカメラが起動し、写真を撮れます。
撮ったあとは、画面右下のボタン(「Use」ボタン)を押して画像を保存できます。
「保存完了」とアラートが出れば、カメラロールに画像が保存されています。

2.GitHubにソースを置きました
ソースはこちら

3.モーダルビューでカメラを起動する
UIImagePickerController を使います。
- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    
    //カメラを起動
    [self kickCamera];
}

//カメラを起動
- (void)kickCamera
{
    UIImagePickerController *imagePickerController =[[UIImagePickerController alloc] init];
    
    //カメラ機能を選択
    imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
    
    imagePickerController.delegate = self;
    
    //YESにしないと、UIImage(カメラで撮ったデータ) が取得できない
    imagePickerController.allowsEditing = YES;
    
    //モーダルビューでカメラ起動
    [self presentViewController:imagePickerController animated:YES completion:nil];
}

これだけで、下記のようにカメラが使えるようになります!
何もしなくても写真撮ったりキャンセルできたりします。


viewDidAppearからカメラを起動していますが、iOS6以降の場合 viewDidLoadから起動しようとすると、
whose view is not in the window hierarchy uiimagepicker
こんな感じのエラーが出て動かないようです。

ちなみに
imagePickerController.sourceType
でカメラを指定してますが、UIImagePickerControllerSourceTypePhotoLibraryでフォトライブラリーを開いたり、 UIImagePickerControllerSourceTypeSavedPhotosAlbumでカメラロールを開いたりもできます。

4.撮った写真をカメラロールに保存する
以下が、必要なコード全てになります。
読めば内容は分かると思います!
//カメラ撮影後のデリゲートメソッド
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    //撮ったデータをUIImageにセットする
    UIImage *image = [info objectForKey:UIImagePickerControllerEditedImage];
    
    //カメラロールに画像を保存
    UIImageWriteToSavedPhotosAlbum(image,
        self, 
        @selector(didFinishSavingImage:didFinishSavingWithError:contextInfo:),
        nil);
    
    //モーダルビューを消す
    [self dismissViewControllerAnimated:YES completion:nil];
}

//画像保存完了後。非同期で呼ばれる
- (void) didFinishSavingImage:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
{
    
    //画像保存完了したよ、とアラートを出す
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil
                                                    message:@"保存完了"
                                                   delegate:nil
                                          cancelButtonTitle:@"OK"
                                          otherButtonTitles:nil];
    [alert show];
}

5.ヘッダファイルに記述するデリゲート
以下のようになります。
@interface CameraViewController : UIViewController
<UINavigationControllerDelegate, UIImagePickerControllerDelegate>

6.シミュレータで試すとエラーが出ると思います
こんなエラー。
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Source type 1 not available'
これは、
imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
で出るエラーで、カメラのソースタイプはシミュレータだと試せないようです。
なので、実機を使いましょう!

7.参考にさせて頂いたサイト
  1. イメージの取得と保存 | マルタケエビス
  2. Custom Camera App | Part 3: Assets Library | Developers' Realm
  3. [iPhone SDK] NSIvalidArgumentException: Source type 1 not available | Apple Support Communities

8.さいごに
思ったより簡単にカメラ機能などが使えて感動しました!
これからまだまだ改良しますので、また本ブログにまとめていこうと思います。

0 件のコメント:

コメントを投稿


Related Posts Plugin for WordPress, Blogger...