【问题标题】:How to crop UIImagePickerController taken picture as it is on display如何裁剪 UIImagePickerController 拍摄的照片,因为它正在显示
【发布时间】:2013-09-26 17:55:08
【问题描述】:

当我使用 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];
}

didFinishPickingMediaWithInfo:

- (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];
}

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

【问题讨论】:

    标签: ios objective-c uiimagepickercontroller crop


    【解决方案1】:

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

    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];
    }
    

    【讨论】:

    • 感谢您的回复,我尝试使用 UIImagePickerControllerEditedImage,然后将其分配给 UIImageView,以便我可以显示它,但由于某种原因,当显示该 imageView 时,应用程序崩溃了......而当我正在使用 UIImagePickerControllerOriginalImage 它工作正常
    • 你有更多的崩溃信息吗?您是否将控制器的allowsEditing 设置为YES?我在许多应用程序中使用此代码没有任何问题。
    • 即使编辑的图像是nil,应用程序也不应该崩溃,因此代码中的其他地方可能存在问题。
    • allowsEditing 设置为 YES,UIImagePickerControllerEditedImage 为 nil
    • 您在设置图像之前是否会关闭控制器?
    【解决方案2】:

    只是将其发布为答案,但我不确定发帖者是否要求提供编辑后的图像。

    当您使用 UIImagePickerController 拍照时,选取器仅显示拍照时实际拍摄的部分图像,如下图所示,其中黑线是 iPhone 的屏幕。

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

    您需要做的就是从上图所示的图像中获取中心,然后您就可以在屏幕上看到与您的图像完全相同的图像。

    【讨论】:

    • 嗨,Wim,谢谢你的回答,这正是我所要求的 :)
    • 很好,你应该把它标记为答案,以便其他人可以找到它。
    【解决方案3】:

    在 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 屏幕制作的,似乎可以工作,但代码取决于设备,还是有更好的解决方案?

    【讨论】:

    • 嗯,根据设备调整大小。
    猜你喜欢
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多