App中拍摄的照片的数据传递

Posted

技术标签:

【中文标题】App中拍摄的照片的数据传递【英文标题】:Data passing of photo taken in App 【发布时间】:2013-07-18 01:49:06 【问题描述】:

我使用了代码

  -(IBAction)TakePhoto 
picker = [[UIImagePickerController alloc]init];
picker.delegate = self;
[picker setSourceType:UIImagePickerControllerSourceTypeCamera];
[self presentViewController:picker animated:YES completion:nil];
[self performSegueWithIdentifier:@"CropImage" sender:sender];



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

//obtaining saving path
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *imagePath = [documentsDirectory stringByAppendingPathComponent:@"latest_photo.png"];

//extracting image from the picker and saving it
NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
if ([mediaType isEqualToString:@"public.image"])
    UIImage *editedImage = [info objectForKey:UIImagePickerControllerEditedImage];
    NSData *webData = UIImagePNGRepresentation(editedImage);
    [webData writeToFile:imagePath atomically:YES];


- (void)imagePickerControllerDidCancel  :(UIImagePickerController *)picker 
[self dismissViewControllerAnimated:YES completion:NULL];



 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

if([segue.identifier isEqualToString:@"CropImage"])

    CropImageViewController *cropImageViewController = segue.destinationViewController;
    cropImageViewController.theImage = yourImage;
    // Similar to [segue.destinationViewController setTheImage:yourImage];
    
 

我在使用情节提要时遇到了问题。我在情节提要中有多个视图控制器。我在第一个视图控制器上有相机按钮(用户可以在应用程序中拍照)。但是,我想将用户在第一个视图控制器中拍摄的照片数据自动传递给另一个视图控制器,以便用户可以裁剪它,然后将其保存到“目录或其他东西”中(尚未决定)。

更新 我现在有四个错误,目前正在说 http://tinypic.com/view.php?pic=15q6y3b&s=5 点击图片会变大

【问题讨论】:

那么问题出在哪里?不知道怎么传递数据或者不知道怎么调用下一个视图? 对不起,我不知道如何传递数据(照片) 【参考方案1】:

实际上,您不必将照片直接传递到下一个视图,因为您已经保存了它。您可以简单地从目标视图控制器中的同一文件中读回图像。 (如果视图控制器彼此不靠近,这种方法会更好。)

+ (UIImage *)readImageFromFile:(NSString *)name

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *imagePath = [documentsDirectory stringByAppendingPathComponent:@"latest_photo.png"];

    NSData *imageData = [NSData dataWithContentsOfFile:imagePath];
    return [UIImage imageWithData:imageData];

更新:您也可以使用属性传递照片。

在您的目标视图控制器(我将其命名为 CropImageViewController)中,在 .h 中,

@property (nonatomic, retain) UIImage *theImage;

在页面顶部的“getPhoto”视图控制器中,

#import "CropImageViewController.h"

在 imagePickerController 中,

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

    ...
    // This line should be
    [self performSegueWithIdentifier:@"CropImage" sender:self];

在prepareForSegue方法中:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

    if([segue.identifier isEqualToString:@"CropImage"])
    
        CropImageViewController *cropImageViewController = segue.destinationViewController;
        cropImageViewController.theImage = yourImage;
        // Similar to [segue.destinationViewController setTheImage:yourImage];
    

确保您设置了一个名称,例如“CropImage”,用于故事板中的 segue 标识符。

【讨论】:

我想使用该属性做第二个。我希望用户拍照,然后该照片转到另一个视图控制器,用户可以在其中裁剪然后保存。因此,如果我使用第一个,它会在发送到裁剪视图控制器仪式之前自动保存? 第一个解决方案是基于您已经完成的,我只是扩展了该方法。既然你更喜欢第二种方法,那么问题解决了吗? 我没有得到第二个代码 [segue.destinationViewController setTheImage:yourImage];我在cropview 控制器中编写了@property 代码。我在哪里写第二个代码? 在获取照片的视图控制器中编写第二个代码。另外,如果有,请在 prepareForSegue 方法中显示代码。 我对三个错误感到困惑,我在问题中编辑了我的代码,你能看一下吗?

以上是关于App中拍摄的照片的数据传递的主要内容,如果未能解决你的问题,请参考以下文章

对象在预加载脚本中传递给函数后丢失其类型

iOS App 上的 cvFloodFill 格式

如何拍照,重定向到显示图像的新页面?

在应用内拍摄时照片没有日期和位置

照片的EXIF数据拍摄日期

JS获取照片拍摄的角度属性,用于旋转控制