iOSのカメラ(UIImagePickerController)を試してみた

UIImagePickerControllerを使って、写真の撮影とフォトライブラリへの保存・参照を行うだけのプログラムを試してみました。
アップルのドキュメントに載ってることそのままだし基礎の基礎ですが、自分用メモということで。



CameraViewController.h

@interface CameraViewController : UIViewController<UINavigationControllerDelegate, UIImagePickerControllerDelegate, UIPopoverControllerDelegate>
{
	UIPopoverController *popover;
}

UIImagePickerControllerDelegateとUINavigationControllerDelegateを設定します。
UIPopoverControllerDelegateはiPadのときに必要となります。


CameraViewController.m

// カメラを開く
- (IBAction)cameraButtonTouched:(id)sender {
	// カメラが利用できるか確認
	if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
	{
		UIImagePickerController *imagePickerController = [[UIImagePickerController alloc]init];
		// カメラかライブラリからの読込指定。カメラを指定。
		[imagePickerController setSourceType:UIImagePickerControllerSourceTypeCamera];
		// トリミングなどを行うか否か
		[imagePickerController setAllowsEditing:YES];
		// Delegate
		[imagePickerController setDelegate:self];
		
		// アニメーションをしてカメラUIを起動
		[self presentViewController:imagePickerController animated:YES completion:nil];
	}
	else
	{
		NSLog(@"camera invalid.");
	}
}

// フォトライブラリーを開く
- (IBAction)libraryButtonTouched:(id)sender {
	if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary])
	{
		UIImagePickerController *imagePickerController = [[UIImagePickerController alloc]init];
		[imagePickerController setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
		[imagePickerController setAllowsEditing:YES];
		[imagePickerController setDelegate:self];
		
		//[self presentViewController:imagePickerController animated:YES completion:nil];
		// iPadの場合はUIPopoverControllerを使う
		popover = [[UIPopoverController alloc]initWithContentViewController:imagePickerController];
		[popover presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
	}
	else
	{
		NSLog(@"photo library invalid.");
	}
}

カメラを起動するのとフォトライブラリを開くのはほぼ同じで、SourceTypeだけ変えればOKです。
ただし、iPadの場合はフォトライブラリはUIPopupControllerで開かなくてはいけないようで、そこだけ異なります。

// 写真撮影後、もしくはフォトライブラリでサムネイル選択後に呼ばれるDelegate
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
	// オリジナル画像
	UIImage *originalImage = (UIImage *)[info objectForKey:UIImagePickerControllerOriginalImage];
	// 編集画像
	UIImage *editedImage = (UIImage *)[info objectForKey:UIImagePickerControllerEditedImage];
	UIImage *saveImage;
	
	if(editedImage)
	{
		saveImage = editedImage;
	}
	else
	{
		saveImage = originalImage;
	}
	
	// UIImageViewに画像を設定
	self.pictureImage.image = saveImage;
	
	if(picker.sourceType == UIImagePickerControllerSourceTypeCamera)
	{
		// カメラから呼ばれた場合は画像をフォトライブラリに保存してViewControllerを閉じる
		UIImageWriteToSavedPhotosAlbum(saveImage, nil, nil, nil);
		[self dismissViewControllerAnimated:YES completion:nil];
	}
	else
	{
		// フォトライブラリから呼ばれた場合はPopOverを閉じる(iPad)
		[popover dismissPopoverAnimated:YES];
		[popover release];
		popover = nil;
	}
}

写真をその場で拡大縮小・トリミングができるので、編集済み画像があればその画像を、なければ元画像をUIImageViewに貼り付けます。
また、カメラで撮影した場合はフォトライブラリへの保存を行います。
iPadでフォトライブラリを開いた場合はpopupをとじます。

// Popupが閉じるときに呼ばれるDelegate
-(void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
	[popover release];
	popover = nil;
}

popup領域外をタップされた時に、popupを解放します。


単純な撮影、フォトライブラリへのアクセスだけであれば、UIImagePickerControllerで簡単に実装できることがわかりました。
もっと複雑なことをやろうとするとAVFoundationを使う必要があるようです。必要性が出てきたら勉強したいと思います。


2012/10/30 追記
GitHubにサンプルプログラムを載せました。
GitHub - okahiro/CameraPictureUpload