wiedii's memo

色々メモリます。

UIImagePickerControllerで写真を撮る

iPhoneで写真を取るときはUIImagePickerViewControllerを使用する。


new->project->SingleView Applicationで、

ViewController.h

#import <UIKit/UIKit.h>
#import <MobileCoreServices/MobileCoreServices.h>

@interface ViewController : UIViewController<UIImagePickerControllerDelegate,UINavigationBarDelegate>
-(IBAction)ibShowCameraView:(id)sender;
-(IBAction)ibShowPhotosAlbum:(id)sender;
@end


ViewController.m

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
   
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


-(void)ibShowCameraView:(id)sender{
    BOOL cam = [self startCameraControllerFromViewController:self usingDelegate:self];
    if(cam)
        NSLog(@"camera");
    else
        NSLog(@"not camera");
}

-(BOOL)startCameraControllerFromViewController: (UIViewController*)controller usingDelegate:(id<UIImagePickerControllerDelegate, UINavigationBarDelegate>) delegate{
    if(([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] == NO) || delegate == nil || controller == nil){
        return NO;
    }
   
    UIImagePickerController* cameraUI = [[UIImagePickerController alloc] init];
    cameraUI.sourceType = UIImagePickerControllerSourceTypeCamera;
    cameraUI.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];
    cameraUI.allowsEditing = NO;
    cameraUI.delegate = delegate;
    [controller presentModalViewController:cameraUI animated:YES];
    return YES;
}


// uiimagepicker delegates
-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
    NSLog(@"picker cancel");
    [self dismissModalViewControllerAnimated:YES];
    /*
    [[picker presentedViewController] dismissModalViewControllerAnimated:YES];
    [picker release];
     */
}

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
    NSString* mediaType = [info objectForKey:UIImagePickerControllerMediaType];
    UIImage *originalImage, *editedImage, *imageToSave;
   
    // 静止画像のキャプチャを処理する
    if(CFStringCompare((CFStringRef)mediaType, kUTTypeImage, 0) == kCFCompareEqualTo){
        editedImage = (UIImage*)[info objectForKey:UIImagePickerControllerEditedImage];
        originalImage = (UIImage*)[info objectForKey:UIImagePickerControllerOriginalImage];
        if(editedImage)
            imageToSave = editedImage;
        else
            imageToSave = originalImage;
       
        //オリジナルまたは加工済みの新規画像をカメラロールに保存する
        UIImageWriteToSavedPhotosAlbum(imageToSave, nil, nil, nil);
        NSLog(@"camera save");
    }
   
   
    //ムービーを保存
    if(CFStringCompare((CFStringRef)mediaType, kUTTypeMovie, 0) == kCFCompareEqualTo){
        NSString* moviePath = [[info objectForKey:UIImagePickerControllerMediaURL] path];
       
        if(UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(moviePath)){
            UISaveVideoAtPathToSavedPhotosAlbum(moviePath, nil, nil, nil);
            NSLog(@"movie save");
        }
    }
    [self dismissModalViewControllerAnimated:YES];
    /*
    [[picker presentedViewController] dismissModalViewControllerAnimated:YES];
    [picker release];
     */
}

@end


ViewController.xib

UIButtonなんかを追加して、File's OwnerのShow the Connections InspectorでReceived ActionsのibShowCameraViewとUIButtonを接続。Touch Up Insideを選択。

ちなみにiOSプログラミングトピックスに載ってるコードをそのまま流用すると、Received memory warningとか出ます。なんででしょ。
iOSプログラミングトピックス

iPhoneプログラミングUIKit詳解リファレンス

iPhoneプログラミングUIKit詳解リファレンス