iphone - UIImagePickerController 编辑允许将 UIImage 锁定为最大尺寸 320x320

标签 iphone cocoa-touch uiimagepickercontroller

更新:

在 iPhone OS 3.0+ 中,整个 UIImagePickerController API 发生了变化。这个问题和答案应该考虑2.2。遗留代码。

<小时/>

当使用 UIImagePickerController 并且您允许编辑图像时。 iPhone 允许用户调整图像大小和平移图像。但是,编辑图像的最大尺寸上限为 320x320。

作为示例,我拍摄了一张 iPhone 屏幕截图并将其放入照片库中,该图片库的大小为 480x320 png。当我使用 UIImagePickerController 选择该图像时,即使我不缩放或平移图像,它也会在从 UIImagePickerController 返回之前被裁剪为 320x320。但是,如果我关闭编辑,图像将返回正确的 480x320 尺寸。

我的理论: iPhone 非常巧妙地显示了 2 个覆盖在图像上的非标准半透明工具栏。这些工具栏在照片上留下了一个无害的 320x320“窗口”。在我看来,这个窗口有效地剪辑了底层照片。

注意: 回调还返回一个包含原始图像和剪切矩形的编辑字典,但当然该矩形的最大尺寸也是 320x320。

关于如何允许缩放和平移大于 320x320 的图像有什么想法吗?

一些代码:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)img editingInfo:(NSDictionary *)editInfo {

        self.myImageView.userInteractionEnabled=YES;
        CGRect imageFrame = myImageView.frame;
        CGPoint imageCenter = myImageView.center;
        imageFrame.size = img.size;
        myImageView.frame = imageFrame;
        self.myImageView.image = img;
        myImageView.center = imageCenter;

        [self dismissModalViewControllerAnimated:YES];
        [self performSelector:@selector(hideToolBars) withObject:nil afterDelay:2.0];
    }

最佳答案

正如克雷格所说,这是开发论坛和苹果常规讨论板上的一个问题。然而,我确实找到了解决方法。我使用的一些代码来自:

Apple Dev Forums

这包括您需要的大部分内容,并解决所有相机方向问题。我添加了以下内容,它将接收编辑信息并使用它来获取带有此添加的原始裁剪矩形:

- (UIImage*)scaleImage:(UIImage*)anImage withEditingInfo:(NSDictionary*)editInfo{

    UIImage *newImage;

    UIImage *originalImage = [editInfo valueForKey:@"UIImagePickerControllerOriginalImage"];
    CGSize originalSize = CGSizeMake(originalImage.size.width, originalImage.size.height);
    CGRect originalFrame;
    originalFrame.origin = CGPointMake(0,0);
    originalFrame.size = originalSize;

    CGRect croppingRect = [[editInfo valueForKey:@"UIImagePickerControllerCropRect"] CGRectValue];
    CGSize croppingRectSize = CGSizeMake(croppingRect.size.width, croppingRect.size.height);

    CGSize croppedScaledImageSize = anImage.size;

    float scaledBarClipHeight = 80;

    CGSize scaledImageSize;
    float scale;

    if(!CGSizeEqualToSize(croppedScaledImageSize, originalSize)){

        scale = croppedScaledImageSize.width/croppingRectSize.width;
        float barClipHeight = scaledBarClipHeight/scale;

        croppingRect.origin.y -= barClipHeight;
        croppingRect.size.height += (2*barClipHeight);

        if(croppingRect.origin.y<=0){
            croppingRect.size.height += croppingRect.origin.y;
            croppingRect.origin.y=0;
        }

        if(croppingRect.size.height > (originalSize.height - croppingRect.origin.y)){
            croppingRect.size.height = (originalSize.height - croppingRect.origin.y);
        }


        scaledImageSize = croppingRect.size;
        scaledImageSize.width *= scale;
        scaledImageSize.height *= scale;

        newImage =  [self cropImage:originalImage to:croppingRect andScaleTo:scaledImageSize];

    }else{

        newImage = originalImage;

    }

    return newImage;
}

我将开发论坛帖子中的回调方法更新为以下内容:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)img editingInfo:(NSDictionary *)editInfo {

    [self dismissModalViewControllerAnimated:YES];
    self.myImageView.userInteractionEnabled=YES;
    CGRect imageFrame = myImageView.frame;
    CGPoint imageCenter = myImageView.center;
    UIImage *croppedImage;


    NSMutableDictionary *imageDescriptor = [editInfo mutableCopy];

    // CGFloat scaleSize = 400.0f;
    CGFloat scaleSize = 640.0f;
    switch ([picker sourceType]) {
            //done
        case UIImagePickerControllerSourceTypePhotoLibrary:
            croppedImage = [self scaleImage:img withEditingInfo:editInfo];
            [imageDescriptor setObject:croppedImage forKey:@"croppedImage"];
            break;


        case UIImagePickerControllerSourceTypeCamera: {
            UIImageOrientation originalOrientation = [[editInfo objectForKey:UIImagePickerControllerOriginalImage] imageOrientation];
            if (originalOrientation != UIImageOrientationUp) {
                NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
                CGRect origRect;
                [[editInfo objectForKey:UIImagePickerControllerCropRect] getValue:&origRect];
                UIImage *rotatedImage = straightenAndScaleImage([editInfo objectForKey:UIImagePickerControllerOriginalImage], scaleSize);
                CGFloat scale = scaleSize/1600.0f;
                origRect.origin.x *= scale;
                origRect.origin.y *= scale;
                origRect.size.width *= scale;
                origRect.size.height *= scale;
                croppedImage = [self cropImage:rotatedImage to:origRect andScaleTo:CGSizeMake(320, 480)];
                [imageDescriptor setObject:croppedImage forKey:@"croppedImage"];
                [pool drain];
            }
            else {
                croppedImage = [self scaleImage:img withEditingInfo:editInfo];
                [imageDescriptor setObject:croppedImage forKey:@"croppedImage"];
            }
        }
            break;

        case UIImagePickerControllerSourceTypeSavedPhotosAlbum: {
            UIImageOrientation originalOrientation = [[editInfo objectForKey:UIImagePickerControllerOriginalImage] imageOrientation];
            if (originalOrientation != UIImageOrientationUp) {
                NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
                CGRect origRect;
                [[editInfo objectForKey:UIImagePickerControllerCropRect] getValue:&origRect];
                UIImage *rotatedImage = straightenAndScaleImage([editInfo objectForKey:UIImagePickerControllerOriginalImage], scaleSize);
                CGFloat scale = scaleSize/640.0f;
                origRect.origin.x *= scale;
                origRect.origin.y *= scale;
                origRect.size.width *= scale;
                origRect.size.height *= scale;
                croppedImage = [self cropImage:rotatedImage to:origRect andScaleTo:CGSizeMake(320, 480)];
                [imageDescriptor setObject:croppedImage forKey:@"croppedImage"];
                [pool drain];
            }
            else {
                croppedImage = [self scaleImage:img withEditingInfo:editInfo];
                [imageDescriptor setObject:croppedImage forKey:@"croppedImage"];
            }
        }
            break;
        default:
            break;
    }

    imageFrame.size = croppedImage.size;
    myImageView.frame = imageFrame;
    myImageView.image = [imageDescriptor objectForKey:@"croppedImage"];
    myImageView.center = imageCenter;


}

关于iphone - UIImagePickerController 编辑允许将 UIImage 锁定为最大尺寸 320x320,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/724092/

相关文章:

iPhone - 以编程方式删除状态栏

ios - 如何在 Swift beta 3 中从 UIImagePickerControllerDelegate 获取 UIImage?

iphone - Foursquare iPhone API 附近的地方

iphone - Corona SDK,为 iOS 设备构建无法正常工作

ios - Objective-C 中的所有对象基本上都是指针吗?

ios - 如何绘制(_ rect : CGRect) actually work?

iphone - Facebook 和 AP Mobile News 上看到的 "Slider"类型标签

ios - UITextView 完成更改选择

ios - 在 Cocoa Touch 中以编程方式切换 View

ios - 我想知道为什么 UIImagePickerController 裁剪正方形有轻微的偏移,以及如何修复它