如何在编辑时将图像叠加添加到UIImagePickerControllerSourceTypePhotoLibrary?

时间:2011-05-24 16:20:14

标签: iphone ios uiimagepickercontroller

我尝试到处寻找答案,但找不到任何有用的信息。

基本上,我希望用户从相册中选择一张图片,然后让应用程序以编辑/裁剪模式显示图片。

在此编辑屏幕上,我想显示一个覆盖屏幕供用户用来对齐他的图像。

然后,他点击保存按钮,通过合并图像,将编辑后的图片与叠加图像一起保存。

我唯一无法找到的方法是在编辑屏幕中添加叠加图片!

我可以在以下情况下轻松完成:

imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;

但是:

imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

我无法使用:

imagePicker.cameraOverlayView = overlayGraphicView;

这是我的问题。

此外,如果我将UIimage添加为子视图而不是此叠加层,即使用户从相册中选择了他的图像,它也会保留在屏幕上。我只希望在选择编辑图像之后以及在编辑完成后将图像保存到相册之前显示叠加层。

感谢您的帮助。

继承人的方法:

- (IBAction)pickPhotoButton:(id)sender {
    NSLog(@"Pick a Current Photo Button Pressed...");

    // Create image picker controller
    UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];

    // Set source to the camera
    imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

    // Delegate is self
    imagePicker.delegate = self;

    // Allow editing of image ?
    imagePicker.allowsEditing = YES;

    // Show image picker
    [self presentModalViewController:imagePicker animated:YES]; 
}

继承我的专辑方法:

// Save the image to photo album
- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{    
    // Access the uncropped image from info dictionary
    UIImage *image = [info objectForKey:@"UIImagePickerControllerEditedImage"];

    // Combine image with overlay before saving!!
    image = [self addOverlayToImage:image];

    // Save image
    UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);

    [picker release];
}

2 个答案:

答案 0 :(得分:6)

您可以成为UIImagePickerController对象的委托,并敏锐地观察UINavigationControllerDelegate方法 - navigationController:didShowViewController:animated:navigationController:willShowViewController:animated:。您可以知道第二个视图控制器何时出现,然后将您的叠加层添加到视图控制器的视图中。样本用法如下所示 -

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    if ( [navigationController.viewControllers count] == 2 ) {
        overlayView.center = CGPointMake(135, 135);
        overlayView.bounds = CGRectZero;

        [viewController.view addSubview:overlayView];

        [UIView beginAnimations:@"animateTableView" context:nil];
        [UIView setAnimationDuration:0.4];
        [overlayView setFrame:CGRectMake( 50, 50, 220, 220)];
        [UIView commitAnimations];
    }
}

答案 1 :(得分:0)

您可以使用以下自定义方法将叠加层添加到Imagepickercontroller

在yourclassname .h文件中定义

@property (nonatomic, retain) UIImagePickerController*      m_Pickercontroller;
@property(nonatomic,retain) UIView *cameraOverlayView;


 In yourclassname.m file

-(void)Loadcaptureview
{
   //Allocating Image Picker Controller 
    m_Pickercontroller=[[UIImagePickerController alloc] init ];
    m_Pickercontroller.delegate=self;
    m_Pickercontroller.allowsEditing=YES;
    m_Pickercontroller.sourceType=UIImagePickerControllerSourceTypeCamera;
    m_Pickercontroller.view.frame=CGRectMake(0, 0, 320, 300); 

    UIButton*Clickbutton=[[UIButton alloc] initWithFrame:CGRectMake(50,200, 60, 60)];
    [Clickbutton setImage:[UIImage imageNamed:@"red-circle-button.png"] forState:UIControlStateNormal];
    [Clickbutton addTarget:self action:@selector(clicked:) forControlEvents:UIControlEventTouchUpInside];

    image1=[[UIImageView alloc] initWithFrame:CGRectMake(50,400, 60, 60)];
    image1.image=[UIImage imageNamed:@"red-circle-button.png"];

    [m_Pickercontroller.cameraOverlayView addSubview:Clickbutton];
    [m_Pickercontroller.cameraOverlayView addSubview:image1];
    [m_Pickercontroller.cameraOverlayView bringSubviewToFront:image1];

    //Hiding the Camera Control
    m_Pickercontroller.showsCameraControls=NO;

    //Presenting the imagepicker Controller to Present Modal view Controller
    [self.navigationController presentModalViewController:m_Pickercontroller animated:YES];
    }

  // Calling the Function

  - (void)viewDidLoad
  {

   [self Loadcaptureview];

   }