iOS相机功能开发全解析
立即解锁
发布时间: 2025-08-25 01:37:25 阅读量: 3 订阅数: 20 


iOS 7开发实战:从入门到精通
### iOS 相机功能开发全解析
#### 1. UIImagePickerController 基础使用
当在真机上运行应用并点击按钮时,会弹出一个简单的相机界面,可用于拍照并选择照片用于应用,若不满意还能重拍。以下是具体操作步骤和代码实现:
- **获取照片**:设置视图控制器以成功展示 `UIImagePickerController` 后,需处理视图控制器对 `UIImagePickerController` 选择完成的响应。使用 `imagePickerController:didFinishPickingMediaWithInfo:` 委托方法来获取照片、更新图像视图并关闭图像选择器。
```objc
-(void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info
{
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
self.imageView.image = image;
self.imageView.contentMode = UIViewContentModeScaleAspectFill;
[self dismissViewControllerAnimated:YES completion:NULL];
}
```
设置图像视图的 `contentMode` 为 `UIViewContentModeScaleAspectFill` 可确保图片在保持宽高比的同时填充整个视图,通常会裁剪图片而非拉伸。也可使用 `UIViewContentModeScaleAspectFit`,它能显示完整图片且保持宽高比,但不一定填充整个视图。
- **处理取消选择**:还需实现 `imagePickerControllerDidCancel:` 委托方法来处理图像选择的取消操作,只需关闭图像选择器视图。
```objc
- (void) imagePickerControllerDidCancel: (UIImagePickerController *) picker
{
[self dismissViewControllerAnimated:YES completion:NULL];
}
```
#### 2. 基本编辑功能实现
可将相机界面设置为可编辑,使用户能裁剪和构图拍摄的照片。操作步骤如下:
- **允许编辑**:将 `UIImagePickerController` 的 `allowsEditing` 属性设置为 `YES`。
```objc
- (IBAction)takePicture:(id)sender
{
// ...
if (self.imagePicker == nil)
{
self.imagePicker = [[UIImagePickerController alloc] init];
self.imagePicker.delegate = self;
self.imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
self.imagePicker.allowsEditing = YES;
}
[self presentViewController:self.imagePicker animated:YES completion:NULL];
}
```
- **获取编辑后的图像**:修改 `imagePickerController:didFinishPickingMediaWithInfo:` 方法以获取编辑后的图像。
```objc
-(void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info
{
UIImage *image = [info objectForKey:UIImagePickerControllerEditedImage];
self.imageView.image = image;
self.imageView.contentMode = UIViewContentModeScaleAspectFill;
[self dismissViewControllerAnimated:YES completion:NULL];
}
```
#### 3. 保存照片到相册
可使用 `UIImageWriteToSavedPhotosAlbum()` 函数将拍摄的照片保存到设备的相册。操作步骤如下:
- **修改获取照片方法**:在 `imagePickerController:didFinishPickingMediaWithInfo:` 方法中添加保存代码。
```objc
-(void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info
{
UIImage *image = (UIImage *)[info objectForKey:UIImagePickerControllerEditedImage];
UIImageWriteToSavedPhotosAlbum (image, nil, nil , nil);
self.imageView.image = image;
self.imageView.contentMode = UIViewContentModeScaleAspectFill;
[self dismissViewControllerAnimated:YES completion:NULL];
}
```
- **隐私授权**:从 iOS 6 开始,访问相册有隐私限制,应用需获得用户明确授权。在应用的 `Info.plist` 文件中添加 `NSPhotoLibraryUsageDescription` 键,并提供应用请求访问相册的原因说明。
#### 4. 录制视频功能实现
`UIImagePickerController` 不仅可用于拍摄静态图像,还能处理视频。以下是设置 `UIImagePickerController` 处理静态图像和视频的步骤:
- **允许视频录制**:更新 `takePicture:` 方法,设置图像选择器允许的媒体类型为相机的所有可用类型。
```objc
- (IBAction)takePicture:(id)sender
{
// Make sure camera is available
if ([UIImagePickerController
isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] == NO)
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
message:@"Camera Unavailable"
delegate:self
cancelButtonTitle:@"Cancel"
otherButtonTitles:nil, nil];
[alert show];
return;
}
if (self.imagePicker == nil)
{
self.imagePicker = [[UIImagePickerController alloc] init];
self.imagePicker.delegate = self;
self.imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
self.imagePicker.mediaTypes = [UIImagePickerController
availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];
self.imagePicker.allowsEditing = YES;
}
[self presentViewController:self.imagePicker animated:YES completion:NULL];
}
```
- **导入框架**:将 `Mobile Core Services` 框架链接到项目,并在视图控制器的头文件中导入其 API。
```objc
//
// ViewController.h
// Recipe 9-2 Recording Videos
//
#import <UIKit/UIKit.h>
#import <MobileCoreServices/MobileCoreServices.h>
@interface ViewController : UIViewController<UIImagePickerControllerDelegate,
UINavigationControllerDelegate>
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@property (weak, nonatomic) IBOutlet UIButton *cameraButton;
@property (strong, nonatomic) UIImagePickerController *imagePicker;
- (IBAction)takePicture:(id)sender;
@end
```
- **处理视频录制完成**:修改 `imagePickerController:didFinishPickingMediaWithInfo:` 方法,根据媒体类型处理视频和照片。
```objc
-(void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info
{
NSString *mediaType = [info objectForKey: UIImagePickerControllerMediaType];
if (CFStringCompare((__bridge CFStringRef) mediaType, kUTTypeMovie, 0) ==
kCFCompareEqualTo)
{
// Movie Captured
NSString *moviePath =
(NSString *) [[info objectForKey: UIImagePickerControllerMediaURL] path];
if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum (moviePath))
{
UISaveVideoAtPathToSavedPhotosAlbum (moviePath, nil, nil, nil);
}
}
else
{
// Picture Taken
UIImage *image =
(UIImage *)[info objectForKey:UIImagePickerControllerEditedImage];
UIImageWriteToSavedPhotosAlbum (image, nil, nil , nil);
self.imageView.image = image;
self.imageView.contentMode = UIViewContentModeScaleAspectFill;
}
[self dismissViewControllerAnimated:YES completion:NULL];
}
```
#### 5. 视频编辑功能实现
虽然 `UIImagePickerController` 可录制和保存视频文件,但无法编辑。可使用 `UIVideo
0
0
复制全文
相关推荐










