IOS从摄像头或者文件选择图片

在iOS开发中,获取用户相机或相册中的图片是一项常见的任务。这涉及到系统提供的多媒体框架,如Photos Framework和AVFoundation Framework。以下将详细介绍如何实现这一功能。我们需要导入必要的框架。对于从相册选择图片,我们会用到Photos Framework,所以要在代码文件顶部引入`Photos`: ```swift import Photos ```对于访问摄像头,我们需要`AVFoundation`框架,添加如下: ```swift import AVFoundation ``` ###相册选择图片1. **请求权限**:在访问用户相册前,必须先请求权限。使用`PHPhotoLibrary`的`requestAuthorization`方法: ```swift PHPhotoLibrary.requestAuthorization { status in if status == .authorized { //用户已授权,可以访问相册} else { //用户未授权或拒绝,处理相应情况} } ``` 2. **展示相册**:创建一个`UIImagePickerController`实例,设置其源类型为相册,并将其代理设置为当前控制器。然后在适当的视图上显示这个控制器: ```swift let imagePickerController = UIImagePickerController() imagePickerController.sourceType = .photoLibrary imagePickerController.delegate = self present(imagePickerController, animated: true, completion: nil) ``` 3. **实现代理方法**:当用户选择图片后,`UIImagePickerControllerDelegate`的`imagePickerController(_:didFinishPickingMediaWithInfo:)`方法会被调用。这里可以获取选中的图片并处理: ```swift func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { if let selectedImage = info[.originalImage] as? UIImage { //使用选定的图片} dismiss(animated: true, completion: nil) } ``` ###摄像头拍摄图片1. **请求权限**:使用`AVCaptureDevice`的`requestAccess(forMediaType:)`方法请求访问摄像头: ```swift AVCaptureDevice.requestAccess(for: .video) { granted in if granted { //用户已授权,可以使用摄像头} else { //用户未授权或拒绝,处理相应情况} } ``` 2. **创建捕获会话**:创建一个`AVCaptureSession`实例,配置输入和输出设备。这里我们只关注视频输入: ```swift guard let captureDevice = AVCaptureDevice.default(for: .video) else { return } do { let input = try AVCaptureDeviceInput(device: captureDevice) let stillImageOutput = AVCaptureStillImageOutput() stillImageOutput.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG] if (captureSession.canAddInput(input) && captureSession.canAddOutput(stillImageOutput)) { captureSession.addInput(input) captureSession.addOutput(stillImageOutput) } else { //处理无法添加输入或输出的情况} } catch let error { print("Error configuring camera: (error.localizedDescription)") } ``` 3. **显示预览层**:创建一个`AVCaptureVideoPreviewLayer`,添加到你的视图层次结构,以便用户可以看到摄像头的实时预览: ```swift let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) previewLayer.frame = view.layer.bounds view.layer.addSublayer(previewLayer) ``` 4. **拍摄图片**:当用户触发拍照时,调用`captureStillImageAsynchronously(from:)`方法: ```swift stillImageOutput.captureStillImageAsynchronously(from: captureSession.inputPorts.first!) { (sampleBuffer, error) in if let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer) { let image = UIImage(data: imageData) //使用拍摄的图片} } ```以上就是iOS应用中从摄像头或相册获取图片的基本步骤。实际开发中,你可能还需要考虑更多细节,如错误处理、照片质量设置、用户界面设计等。确保遵循Apple的HIG(Human Interface Guidelines)来提供良好的用户体验。
zip
CameraGetImage.zip 预估大小:23个文件
folder
CameraGetImage 文件夹
folder
CameraGetImageTests 文件夹
file
CameraGetImageTests.m 666B
file
CameraGetImageTests-Info.plist 689B
folder
en.lproj 文件夹
file
InfoPlist.strings 45B
folder
CameraGetImage.xcodeproj 文件夹
folder
project.xcworkspace 文件夹
file
contents.xcworkspacedata 159B
folder
xcuserdata 文件夹
folder
jianjun-wu.xcuserdatad 文件夹
file
UserInterfaceState.xcuserstate 50KB
file
project.pbxproj 19KB
folder
xcuserdata 文件夹
folder
jianjun-wu.xcuserdatad 文件夹
folder
xcschemes 文件夹
file
CameraGetImage.xcscheme 4KB
file
xcschememanagement.plist 576B
folder
CameraGetImage 文件夹
file
main.m 346B
file
MainViewController.h 404B
file
AppDelegate.h 286B
file
AppDelegate.m 2KB
file
.DS_Store 6KB
file
CameraGetImage-Info.plist 1KB
file
MainViewController.m 5KB
folder
Images.xcassets 文件夹
folder
AppIcon.appiconset 文件夹
file
Contents.json 333B
file
.DS_Store 6KB
file
.DS_Store 6KB
folder
LaunchImage.launchimage 文件夹
file
Contents.json 442B
file
.DS_Store 6KB
file
CameraGetImage-Prefix.pch 344B
folder
en.lproj 文件夹
file
InfoPlist.strings 45B
file
.DS_Store 6KB
zip 文件大小:47.39KB