【发布时间】:2011-07-25 06:53:08
【问题描述】:
在 iPhone 应用程序中,我想以编程方式从相机拍照并保存到照片库中。 iPhone模拟器可以吗? 所以请告诉我你有任何链接或材料。
提前致谢
【问题讨论】:
-
在模拟器中无法从相机拍照,您必须使用设备测试您的代码。
标签: iphone objective-c cocoa-touch
在 iPhone 应用程序中,我想以编程方式从相机拍照并保存到照片库中。 iPhone模拟器可以吗? 所以请告诉我你有任何链接或材料。
提前致谢
【问题讨论】:
标签: iphone objective-c cocoa-touch
您将为此目的使用 uiimagepickercontroller。首先,导入 MobileCoreServices.framework。然后拉起相机:
if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
NSArray *media = [UIImagePickerController
availableMediaTypesForSourceType: UIImagePickerControllerSourceTypeCamera];
if ([media containsObject:(NSString*)kUTTypeImage] == YES) {
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
//picker.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;
[picker setMediaTypes:[NSArray arrayWithObject:(NSString *)kUTTypeImage]];
picker.delegate = self;
[self presentModalViewController:picker animated:YES];
//[picker release];
}
else {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Unsupported!"
message:@"Camera does not support photo capturing."
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
[alert release];
}
}
else {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Unavailable!"
message:@"This device does not have a camera."
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
[alert release];
}
然后,通过实现 uiimagepickercontrollerdelegate 和一个保存函数来保存照片:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
NSLog(@"Media Info: %@", info);
NSString *mediaType = [info valueForKey:UIImagePickerControllerMediaType];
if([mediaType isEqualToString:(NSString*)kUTTypeImage]) {
UIImage *photoTaken = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
//Save Photo to library only if it wasnt already saved i.e. its just been taken
if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {
UIImageWriteToSavedPhotosAlbum(photoTaken, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
}
}
[picker dismissModalViewControllerAnimated:YES];
[picker release];
}
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {
UIAlertView *alert;
//NSLog(@"Image:%@", image);
if (error) {
alert = [[UIAlertView alloc] initWithTitle:@"Error!"
message:[error localizedDescription]
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
[alert release];
}
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
[picker dismissModalViewControllerAnimated:YES];
}
有关图片的更多信息:didFinishSaving.... 可以在这里找到
也可以看看这篇文章
https://stackoverflow.com/questions/1282830/uiimagepickercontroller-uiimage-memory-and-more
【讨论】:
在模拟器中是不可能的。你必须使用设备。
【讨论】:
我希望你意识到模拟器没有摄像头.....所以我想那是不可能的。您绝对可以使用设备....您可以使用UIImagePickerController 来捕获图像。
【讨论】:
以编程方式拍照需要 3 个先决条件:
设备需要通过摄像头检查
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
相机控件需要隐藏(picker是一个UIImagePickerController)
picker.showsCameraControls = NO;
使用 UIImagePickerController 中的 takePicture
[选择器拍照];
旁注,因为它确实困扰了我几分钟,takePicture 方法也会关闭视图。
还在这里发布了更完整的答案Other Stack answer
【讨论】: