UIImagePickerController editing allowed locks UIImage to max size of 320x320

前端 未结 6 1204
无人及你
无人及你 2021-01-30 12:01

Update:

With iPhone OS 3.0+, the whole UIImagePickerController API has changed. This question and answer should be considered 2.2. legacy code.


When using

6条回答
  •  生来不讨喜
    2021-01-30 12:45

    As craig said, this is an issue in the dev forums and apples regular discussion board. I did, however, find a way around it. I'm using a bit of code from:

    Apple Dev Forums

    This includes most of what you need, and takes care of all the camera orientation issues. I've added the following which will take in the editing info and use it to get the original cropping rect with this addition:

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

    I updated the call back method from the dev forums post to the following:

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

提交回复
热议问题