欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

基于Swift的iOS应用程序开发:使用UIImagePickerController调取摄像头进行拍照

程序员文章站 2022-05-16 10:23:30
一、设置权限 这一点非常重要,找到工程内的info.plist文件,在其中添加以下项: privacy - camera usage description 为你添加的项设置type为stri...

一、设置权限

这一点非常重要,找到工程内的info.plist文件,在其中添加以下项:

privacy - camera usage description
为你添加的项设置type为string,然后在value一列中输入一句话,可以任意输入,这句话旨在提醒用户我们需要获得使用摄像头的权限:

基于Swift的iOS应用程序开发:使用UIImagePickerController调取摄像头进行拍照

二、实现/继承代理

调取摄像头需要用到以下两个系统代理:

uiimagepickercontrollerdelegate
uinavigationcontrollerdelegate
所以我们的viewcontroller需要实现这两个代理:

import uikit

class demotakephotoviewcontroller: uiviewcontroller,uiimagepickercontrollerdelegate,uinavigationcontrollerdelegate {
//...
}

三、编写方法,调取系统摄像头

调取摄像头其实就是呼出一个系统已定义的viewcontroller:

uiimagepickercontroller
具体使用该viewcontroller的方式如下:

let photopickerviewcontroller:uiimagepickercontroller = uiimagepickercontroller()
photopickerviewcontroller.sourcetype = uiimagepickercontrollersourcetype.camera
photopickerviewcontroller.delegate = self
self.present(photopickerviewcontroller, animated: true, completion: nil)
注意上面代码中,在第二行等号的右边所出现的以下代码:

uiimagepickercontrollersourcetype.camera
就是这句代码,指定了uiimagepickercontroller要打开的是系统摄像头,我们可以查看一下uiimagepickercontrollersourcetype类的源代码,发现它本身是一个枚举:
public enum uiimagepickercontrollersourcetype : int {
 
    case photolibrary

    case camera

    case savedphotosalbum
}
这个枚举非常简单易懂:

photolibrary:系统图库

camera:系统摄像头

savedphotosalbum:相册

也就是说我们可以通过设置photopickerviewcontroller的sourcetype为上述三项中的一项,来决定调用哪个系统功能

稍微进一步查看一下源代码,我们发现还有其它非常多的枚举量:

public enum uiimagepickercontrollersourcetype : int {

    
    case photolibrary

    case camera

    case savedphotosalbum
}

public enum uiimagepickercontrollerqualitytype : int {

    
    case typehigh // highest quality

    case typemedium // medium quality, suitable for transmission via wi-fi 

    case typelow // lowest quality, suitable for tranmission via cellular network

    @available(ios 4.0, *)
    case type640x480 // vga quality

    @available(ios 5.0, *)
    case typeiframe1280x720

    @available(ios 5.0, *)
    case typeiframe960x540
}

public enum uiimagepickercontrollercameracapturemode : int {

    
    case photo

    case video
}

public enum uiimagepickercontrollercameradevice : int {

    
    case rear

    case front
}

public enum uiimagepickercontrollercameraflashmode : int {

    
    case off

    case auto

    case on
}
看懂这些枚举量的用途不需要太好的英文水平,除了在本例中用到的uiimagepickercontrollersourcetype外,我在这里将其它枚举量简单做个说明:

uiimagepickercontrollerqualitytype:成像质量

uiimagepickercontrollercameracapturemode:拍照或者录像

 

uiimagepickercontrollercameradevice:选择前置摄像头或是后置摄像头

uiimagepickercontrollercameraflashmode:闪光灯模式


不再展开了,继续回来。我将调用摄像头拍照的代码封装成了一个方法,便于绑定到触发事件上:

/**
 *  当用户点击界面上的拍照按钮时,会打开系统的拍照功能
 */
@ibaction func takephoto(_ sender: any) {
       
    /*
     *  用来打开系统相册的view controller
     */
    let photopickerviewcontroller:uiimagepickercontroller = uiimagepickercontroller()
    photopickerviewcontroller.sourcetype = uiimagepickercontrollersourcetype.camera
    photopickerviewcontroller.delegate = self
    self.present(photopickerviewcontroller, animated: true, completion: nil)
        
}

四、编写方法,获取摄像头拍摄的照片

要获取摄像头所拍摄的照片,我们主要需要重载以下方法:

func imagepickercontroller(_ picker: uiimagepickercontroller, didfinishpickingmediawithinfo info: [string : any]) {
//...
}
注意这个方法入参列表中的第二个参数“didfinishpickingmediawithinfo info:[string : any]”,摄像头的拍摄结果就会被保存在这个参数里面,我们可以通过以下方法来获取:

guard var selectedimage = info[uiimagepickercontrolleroriginalimage] as? uiimage else {
    fatalerror("expected a dictionary containing an image, but was provided the following: \(info)")
}
这样以来,摄像头的拍摄结果就成为了一个uiimage对象。

下面贴出完整的方法:

/**
 *  当用户从完成拍照后,系统会自动会调用到本方法
 */
func imagepickercontroller(_ picker: uiimagepickercontroller, didfinishpickingmediawithinfo info: [string : any]) {
    guard var selectedimage = info[uiimagepickercontrolleroriginalimage] as? uiimage else {
        fatalerror("expected a dictionary containing an image, but was provided the following: \(info)")
    }

    picker.dismiss(animated: true, completion: nil)
}
拿到了uiimage对象后,我们就可以做自己需要的操作了,比如将图片显示在界面上,或是上传到服务器

五、编写方法,取消拍摄

以下方法为我们提供了退出拍摄的途径:

/**
 *  当用户在相册界面取消操作的时候,会调用到本方法
 */
func imagepickercontrollerdidcancel(_ picker: uiimagepickercontroller) {
    picker.dismiss(animated: true, completion: nil)
}

小结

调取摄像头的各项功能都用到了swift提供的代理(delegate)机制,它的最大的好处在于,在上述各步骤中,我们只有在调取摄像头的时候需要手动触发,其它方法全部都由代理自动调用,我们只要实现这些方法就可以了。