イメージの取得と保存

イメージを取得する

カメラやアルバムからイメージを取得するにはUIImagePickerControllerを使用する。

// 使用できるか出来ないかの判定は、isSourceTypeAvailableメソッドを使う
if ( [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary] ) {
	// UIImageControllerの初期化
	UIImagePickerController *ipc = [[UIImagePickerController alloc] init];
	/* UIImageControllerで取得できるデータは以下の3つ
	 *
	 * SourceTypeCamera             : カメラを起動する
	 * SourceTypePhotoLibrary       : フォトライブラリーを開く
	 * SourceTypeSavedPhotosAlbum   : (カメラがあるiPhoneは)カメラロールから選択する
	 */
	[ipc setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
	// Delegateをセット
	[ipc setDelegate:self];
	// NOを設定するとイメージを取得できない
	[ipc setAllowsEditing:YES];
	// 指定したViewを一番上に表示する
	[self presentModalViewController:ipc animated:YES];
	// 表示してしまった後はメモリから消去してよい
	[ipc release];
}

イメージを表示する

UIImagePickerControllerのイメージを取得した後に呼び出されるデリゲート関数(didFinishPickingMediaWithInfo)に、取得イメージをImageViewに表示する処理を追記する。UIImagePickerControllerをデリゲートする場合は、UIImagePickerControllerDelegateとUINavigationControllerDelegateをヘッダファイルに記述する必要がある。

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
	// 選択したイメージをUIImageにセットする
	UIImage *image = [info objectForKey:UIImagePickerControllerEditedImage];
	// UIImageをImageViewerにセットする
	[imageView setImage:image];
	// [picker parentViewController]の部分はselfでも良い?
	[[picker parentViewController] dismissModalViewControllerAnimated:YES];
}

イメージを保存する

ImageViewに表示されたイメージをフォトアルバムに保存する。イメージを端末内に保存される前にアプリを終了してしまうと、サムネイルだけが保存されイメージが保存されないので、保存終了後にアラートを表示させるようにする。

UIImage *image = [aImageView image];
if ( image != nil ) {
	// イメージを保存する
	UIImageWriteToSavedPhotosAlbum( image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil );
}

アラート表示部分は以下のように記述する。

// アラートを表示させる部分は、image:didFinishSavingWithError:contextInfo:という書式が必須らしい
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {
	// アラートを表示する
	UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"保存終了" message:@"画像を保存しました" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
	[alert show];
	[alert release];
}

アプリ内部(アプリのホームディレクトリ内)に画像を保存する場合は、以下のように記述する。

UIImage *image = [aImageView image];
if ( image != nil ) {
	// 保存ディレクトリを指定
	NSString* docDir = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
	// 保存ディレクトリ+ファイル名を指定
	NSString* photoFilePath = [NSString stringWithFormat:@"%@/photo.jpg", docDir];
	// 圧縮率を指定しJPEGファイルで保存する
	[UIImageJPEGRepresentation(image, 0.7f) writeToFile:photoFilePath atomically:YES];
}

保存ディレクトリの指定には、文字列追加を行うことのできるstringByAppendingPathComponentメソッドを使用する。またファイル名の指定には、フォーマットを指定した文字列記述のできるstringWithFormatを使用する。最後にUIImageJPEGRepresentatio関数によって画像データをNSデータ型に変換したあと指定した保存先に保存を行う。

Pocket