代码之家  ›  专栏  ›  技术社区  ›  Adam Bardon

如何在显示时裁剪UIImagePickerController拍摄的图片

  •  9
  • Adam Bardon  · 技术社区  · 13 年前

    当我使用UIImagePickerController拍照时,画面比屏幕上看到的要多。。。我怎样才能拍照/裁剪它,使它与我在屏幕上看到的完全一样?

    编辑:我将添加代码,以指定我的问题:

    - (void)showImagePickerForSourceType:(UIImagePickerControllerSourceType)sourceType
    {
    
    UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];
    imagePickerController.modalPresentationStyle = UIModalPresentationCurrentContext;
    imagePickerController.sourceType = sourceType;
    imagePickerController.delegate = self;
    imagePickerController.showsCameraControls = NO;
    imagePickerController.allowsEditing = YES;
    
    if (sourceType == UIImagePickerControllerSourceTypeCamera)
    {
        [[NSBundle mainBundle] loadNibNamed:@"OverlayView" owner:self options:nil];
        self.overlayView.frame = imagePickerController.cameraOverlayView.frame;
        imagePickerController.cameraOverlayView = self.overlayView;
        //self.overlayView = nil;
        self.overlayImage.image = self.imageView.image;
        self.overlayImage.alpha = 0.5;
    
        UISlider *slider=[[UISlider alloc]initWithFrame:CGRectMake(60, 80, 200, 30)];
        [slider setMaximumValue:1.0];
        [slider setMinimumValue:0.0];
        [slider setValue:0.5];
        [slider addTarget:self action:@selector(sliderChanged:)  forControlEvents:UIControlEventValueChanged];
    
        if (self.working == TRUE)
        {
            [imagePickerController.cameraOverlayView addSubview:self.overlayImage];
            [imagePickerController.cameraOverlayView addSubview:slider];
        }
    }
    
    self.imagePickerController = imagePickerController;
    [self presentViewController:self.imagePickerController animated:YES completion:nil];
    }
    

    did完成选择带有信息的媒体:

    - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
    {
    [self dismissViewControllerAnimated:YES completion:NULL];
    
    //this works, image is displayed
    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
    //this doesn't work, image is nil
    UIImage *image = [info objecyForKey:UIImagePickerControllerEditedImage];    
    
    [self.imageView setImage:image];
    self.working = TRUE;
    
    self.imagePickerController = nil;
    //[self dismissViewControllerAnimated:YES completion:NULL];
    }
    

    何时可以使用UIImagePickerControllerEditedImage imagePickerController.showsCameraControls = NO; ?

    3 回复  |  直到 13 年前
        1
  •  10
  •   Rok Jarc    13 年前

    根据信息字典的关键字,您可以获得原始或裁剪的图像。

    这个 pickedImageEdited 将是您要查找的裁剪图像 pickedImageOriginal 将是完整的原始图像。

    -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
    {
        UIImage *pickedImageOriginal = [info objectForKey:UIImagePickerControllerOriginalImage];
    
        UIImage *pickedImageEdited = [info objectForKey:UIImagePickerControllerEditedImage];
    
        //do your stuff
    
        [self dismissViewControllerAnimated:YES completion:nil];
    }
    
        2
  •  9
  •   Wim Haanstra    13 年前

    只是把这个作为答案发布,但我不确定海报是否要求编辑图片。

    当您使用UIImagePickerController拍摄照片时,选择器只显示拍摄照片时实际拍摄的图像的一部分,如下图所示,黑线是iPhone的屏幕。

    enter image description here

    你从相机上得到的图像是全尺寸的图像,但在屏幕上只是图像的中心,图像的宽度或高度都达到了屏幕大小。

    你所需要做的就是从上面显示的图像中获取中心,这样你就可以在屏幕上获得准确的图像。

        3
  •  5
  •   Adam Bardon    13 年前

    在Wim回答后,我想出了这样的解决方案:

    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
    
    UIGraphicsBeginImageContext(CGSizeMake(720, 960));
    [image drawInRect: CGRectMake(0, 0, 720, 960)];
    UIImage *smallImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    CGRect cropRect = CGRectMake(40, 0, 640, 960);
    
    CGImageRef imageRef = CGImageCreateWithImageInRect([smallImage CGImage], cropRect);
    [self.imageView setImage:[UIImage imageWithCGImage:imageRef]];
    

    正如你所看到的,这是为3.5英寸的iPhone屏幕制作的,它似乎可以工作,但代码取决于设备,或者有更好的解决方案吗?

    推荐文章