• Camera


    相机这个功能在iOS中很常用,自己也写过好几次了,都是知道大概,然后就把上一次的代码直接照搬过去就OK了,但是,像这种非常基础的东西我们还是需要独立的去写,而不是copy代码,等到我们熟记于心的时候,再copy吧。今天终于把这块儿知识认真的看了一下,不多说了 上代码。

    1.+ (BOOL)isSourceTypeAvailable:(UIImagePickerControllerSourceType)sourceType;                 // returns YES if source is available (i.e. camera present)

       isSourceTypeAvailable: 检测用户的设备,有没有支持所指定 的媒体类型() 一般是第一道判断。

    例如 在模拟器下 

    [UIImagePickerControllerisSourceTypeAvailable:  UIImagePickerControllerSourceTypePhotoLibrary]; 这句代码返回 YES。

    但是 [UIImagePickerControllerisSourceTypeAvailable:  UIImagePickerControllerSourceTypeCamera]; 这句就返回 NO。

       

     typedef NS_ENUM(NSInteger, UIImagePickerControllerSourceType) {

        UIImagePickerControllerSourceTypePhotoLibrary,

        UIImagePickerControllerSourceTypeCamera,

        UIImagePickerControllerSourceTypeSavedPhotosAlbum

    };

    2. + (NSArray *)availableMediaTypesForSourceType:(UIImagePickerControllerSourceType)sourceType; // returns array of available media types (i.e. kUTTypeImage)

     获取能够支持的媒体类型的 public.image/public.movie

     若 没有支持的 则返回为0. 例如, 模拟器下调用这个代码 

        NSArray* availableMediaTypes = 

        [UIImagePickerControlleravailableMediaTypesForSourceType:

         UIImagePickerControllerSourceTypeCamera];

     那么  数组 availableMediaTypes 为nil。

    下面我们就开始创建 你所需要的功能了,

    3.//创建图像选取控制器

        UIImagePickerController* imagePickerController = 

        [[UIImagePickerControlleralloc] init]; //  这才是核心内容,前面的内容都是些用于过滤的 “守卫”。

    4.    //设置图像选取控制器的来源模式为相机模式

        imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; // 这句 决定了你是想,打开相册呢还是打开相机呢,三个参数自己根据需求去写。

    这里我补充一下,肯定有许多小朋友迷惑UIImagePickerControllerSourceTypePhotoLibrary 和 UIImagePickerControllerSourceTypeSavedPhotosAlbum有什么区别呢,今天yoyo就告诉你吧,

    这两个的区别就是对于用户的相册有没有分类,PhotoLibrary 是分类的,所以有两页,第一页是分类,第二类是图片或者视频。而SavedPhotosAlbum没有分类,只有一页,即就是PhotoLibrary类型的第二页。

     

     typedef NS_ENUM(NSInteger, UIImagePickerControllerSourceType) {

        UIImagePickerControllerSourceTypePhotoLibrary,

        UIImagePickerControllerSourceTypeCamera,

        UIImagePickerControllerSourceTypeSavedPhotosAlbum

    };

    继续看代码,我给小伙伴们细细讲解,

     5.//设置图像选取控制器的类型 mediaTypes 所支持的媒体类型

        imagePickerController.mediaTypes = [[[NSArray alloc

                                             initWithObjects:(NSString*)kUTTypeMovie,kUTTypeImage, nil] autorelease];

    小伙伴们,你们知道有些APP里面的照相功能只有拍照没有摄像,或者两者都有呢?或者是 在相册里面,只有视频或者只有图片,或者全都有?你们可能也很想知道这个答案。

    我这就给你们讲,

    首先在第4阶部分已经选取了媒体类型,

    假设  imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

    那么对于

     imagePickerController.mediaTypes = [[[NSArray alloc] 

                                             initWithObjects:(NSString*)kUTTypeMovie,kUTTypeImage, nil] autorelease];

    就是相册里面既有视频也有图片。若是你只要其一,则只在数组里面去修改元素。

    假设  imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera; 表示启用了相机,那么

     imagePickerController.mediaTypes = [[[NSArray alloc] 

                                             initWithObjects:(NSString*)kUTTypeMovie,kUTTypeImage, nil] autorelease];

     就表示 既能拍照也能拍视频。

    上面的5阶 已经说完了8成,然后就是设置一些参数,和跳转picker功能

    //设置摄像图像品质

        imagePickerController.videoQuality = UIImagePickerControllerQualityTypeHigh;

        //设置最长摄像时间(秒数)

        imagePickerController.videoMaximumDuration = 30;

        //允许用户进行编辑

        imagePickerController.allowsEditing = YES;

        //设置委托对象  imagePickerController的协议是

    <UINavigationControllerDelegate, UIImagePickerControllerDelegate >大家记好了啊。

        imagePickerController.delegate = self;

        //以模式视图控制器的形式显示

        [selfpresentModalViewController:imagePickerController animated:YES];

     

     在camera 或 album 里面 点击 “取消”按钮的时候,就会调用下面的这个委托方法

    - (void)imagePickerControllerDidCancel:(UIImagePickerController*)picker

    {

        [picker dismissModalViewControllerAnimated:YES];

    }

     点击“确定”按钮的时候,就会调用这个委托方法

    - (void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info

     {

    //打印出字典中的内容

        NSLog(@"Get the media info: %@", info);

      **1.  //获取媒体类型

        NSString* mediaType = [info objectForKey:UIImagePickerControllerMediaType];

        //判断是静态图像还是视频

        if([mediaType isEqualToString:(NSString*)kUTTypeImage])

    也可以这样写 

        if([mediaType isEqualToString:@"public.image")

         {

            //获取用户编辑之后的图像

            UIImage* editedImage = 

           **2. [info objectForKey:UIImagePickerControllerEditedImage];

            //将该图像保存到媒体库中

            UIImageWriteToSavedPhotosAlbum(editedImage, self

                                           @selector(image:didFinishSavingWithError:contextInfo:), NULL);

        }

        else if([mediaType isEqualToString:(NSString*)kUTTypeMovie])

        {

            //获取视频文件的URL

         **3.   NSURL* mediaURL = [info objectForKey:UIImagePickerControllerMediaURL];

            //创建ALAssetsLibrary对象并将视频保存到媒体库  需要抛出 #import <AssetsLibrary/AssetsLibrary.h>

            ALAssetsLibrary* assetsLibrary = [[ALAssetsLibrary alloc] init];

            [assetsLibrary writeVideoAtPathToSavedPhotosAlbum:mediaURL 

                                              completionBlock:^(NSURL* assetURL, NSError* error)

             {

                 if (!error)

                 {

                     NSLog(@"Captured video saved with no error.");

                 }

                 else

                 {

                     NSLog(@"Error occured while saving the video: %@", error);

                 }

             }];

            [assetsLibrary release];

        }

        

        [picker dismissModalViewControllerAnimated:YES];

    }

    }

    **1, **2, **3这三步很重要 请大家熟记。 完了 ,我今天要讲解的就是这些了。大家自己写写demo吧,趁热打铁。

    - (IBAction)takePictureButtonClick:(id)sender

    {

        if(![UIImagePickerController isSourceTypeAvailable:

             UIImagePickerControllerSourceTypePhotoLibrary])

        {

            NSLog(@"Sorry, no camera or camera is unavailable.");

            return;

        }

        //获得相机模式下支持的媒体类型

        

        NSArray* availableMediaTypes = 

        [UIImagePickerController availableMediaTypesForSourceType:

         UIImagePickerControllerSourceTypeCamera];

        BOOL canTakePicture = NO;

        for (NSString* mediaType in availableMediaTypes)

        {

            // UIImagePickerControllerSourceTypePhotoLibraryUIImagePickerControllerSourceTypeCameraUIImagePickerControllerSourceTypeSavedPhotosAlbum

            

            //public.image

            //public.movie

            if([mediaType isEqualToString:(NSString*)kUTTypeImage])

            {

                //支持拍照

                canTakePicture = YES;

                break;

            }

        }

        //检查是否支持拍照

        if(!canTakePicture)

        {

            NSLog(@"Sorry, taking picture is not supported.");

            return;

        }

        //创建图像选取控制器

        UIImagePickerController* imagePickerController = 

        [[UIImagePickerControlleralloc] init];

        //设置图像选取控制器的来源模式为相机模式

        imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

        //UIImagePickerControllerSourceTypeSavedPhotosAlbum 没有视频 只有展示图片的页面

        //UIImagePickerControllerSourceTypePhotoLibrary 没有视频 但是在第一页有分类

        //设置图像选取控制器的类型为静态图像

    //    imagePickerController.mediaTypes = [[[NSArray alloc] 

    //                                         initWithObjects:(NSString*)kUTTypeMovie, nil] autorelease];

        //允许用户进行编辑

        imagePickerController.allowsEditing = YES;

        //设置委托对象

        imagePickerController.delegate = self;

        //以模式视图控制器的形式显示

        [selfpresentModalViewController:imagePickerController animated:YES];

        [imagePickerController release];

    }

  • 相关阅读:
    Windows 10 开发日记(二)-- 手势顺序调研
    Windows 10 开发日记(一) -- 手势通览
    开篇说两句
    我从上海回苏州了,你懂的!
    数组名相关
    指针相关笔记
    static相关
    输入分式,输出化简式的C语言算法
    语句界定
    switch相关
  • 原文地址:https://www.cnblogs.com/Camier-myNiuer/p/3420284.html
Copyright © 2020-2023  润新知