Memory Warning UIImagepickerController IOS 7

后端 未结 3 1609
借酒劲吻你
借酒劲吻你 2020-12-25 08:20

Could anybody help me with this issue I\'m a bit new to objective c and iOS. I\'ve been working on it but I can\'t figure out how to fix the problem, My app is really simpl

相关标签:
3条回答
  • 2020-12-25 09:08

    I have fixed this issue by JRG-Developer-s answer up here with a little modifications: I `m using categories to fix orientation of image ans scaling it down before presenting and when done, I call Weak Self to assign this scaled and fixed image to my imageview)

    -(void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
    {    
        UIImage *lvImage = [info objectForKey:UIImagePickerControllerOriginalImage];
        //CGSize pickedImageSize = lvImage.size;
        if (postHandler == nil)
        {
            postHandler = [[PostHandler alloc] init];
        }
    
        //_postItemImageView.image = lvImage;
        //postHandler.wholeScreenImage = lvImage;// to proceed editing, cropping, tagging ...
        //_postItemImageView.image = postHandler.wholeScreenImage; set in viewWillAppear
        __weak PostPrepareViewController *weakSelf = self;
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
        {
    
            // Resize the image
            UIImage * scaledImage = [[lvImage imageByScalingAndCroppingForSize:_postItemImageView.frame.size] fixOrientation];
            // Optionally save the image here...
            //CGSize scaledimageSize = scaledImage.size;
            dispatch_async(dispatch_get_main_queue(), ^
            {
                postHandler.wholeScreenImage = scaledImage;
                [weakSelf didScaleDownImage];
            });           
        });
    
    
        if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
        {
            [self.popOver dismissPopoverAnimated:YES];
        }
        else
        {
            [self dismissViewControllerAnimated:YES completion:nil];
        }
    }
    

    and lower:

    -(void) didScaleDownImage
    {
       _postItemImageView.image = postHandler.wholeScreenImage;
    }
    

    code of scaling was taken from the net:

    -(UIImage *)imageByScalingAndCroppingForSize:(CGSize)targetSize
    {
        UIImage *sourceImage = self;
        UIImage *newImage = nil;
        CGSize imageSize = sourceImage.size;
        CGFloat width = imageSize.width;
        CGFloat height = imageSize.height;
        CGFloat targetWidth = targetSize.width;
        CGFloat targetHeight = targetSize.height;
        CGFloat scaleFactor = 0.0;
        CGFloat scaledWidth = targetWidth;
        CGFloat scaledHeight = targetHeight;
        CGPoint thumbnailPoint = CGPointMake(0.0,0.0);
    
        if (CGSizeEqualToSize(imageSize, targetSize) == NO)
        {
            CGFloat widthFactor = targetWidth / width;
            CGFloat heightFactor = targetHeight / height;
    
            if (widthFactor > heightFactor)
            {
                scaleFactor = widthFactor; // scale to fit height
            }
            else
            {
                scaleFactor = heightFactor; // scale to fit width
            }
    
            scaledWidth  = width * scaleFactor;
            scaledHeight = height * scaleFactor;
    
            // center the image
            if (widthFactor > heightFactor)
            {
                thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5;
            }
            else
            {
                if (widthFactor < heightFactor)
                {
                    thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5;
                }
            }
        }
    
        UIGraphicsBeginImageContext(targetSize); // this will crop
        //UIGraphicsBeginImageContextWithOptions(targetSize, 1.0, 0.0);
    
        CGRect thumbnailRect = CGRectZero;
        thumbnailRect.origin = thumbnailPoint;
        thumbnailRect.size.width  = scaledWidth;
        thumbnailRect.size.height = scaledHeight;
    
        [sourceImage drawInRect:thumbnailRect];
    
        newImage = UIGraphicsGetImageFromCurrentImageContext();
    
        if(newImage == nil)
        {
            NSLog(@"could not scale image");
        }
    
        //pop the context to get back to the default
        UIGraphicsEndImageContext();
    
        return newImage;
    }
    

    and code for changing (fixing) image orientation was also taken from the net:

    - (UIImage *)fixOrientation
    {    // No-op if the orientation is already correct
        if (self.imageOrientation == UIImageOrientationUp) return self;
    
        // We need to calculate the proper transformation to make the image upright.
        // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored.
        CGAffineTransform transform = CGAffineTransformIdentity;
    
        switch (self.imageOrientation) {
            case UIImageOrientationDown:
            case UIImageOrientationDownMirrored:
                transform = CGAffineTransformTranslate(transform, self.size.width, self.size.height);
                transform = CGAffineTransformRotate(transform, M_PI);
                break;
    
            case UIImageOrientationLeft:
            case UIImageOrientationLeftMirrored:
                transform = CGAffineTransformTranslate(transform, self.size.width, 0);
                transform = CGAffineTransformRotate(transform, M_PI_2);
                break;
    
            case UIImageOrientationRight:
            case UIImageOrientationRightMirrored:
                transform = CGAffineTransformTranslate(transform, 0, self.size.height);
                transform = CGAffineTransformRotate(transform, -M_PI_2);
                break;
    
            default:
                break;
        }
    
        switch (self.imageOrientation) {
            case UIImageOrientationUpMirrored:
            case UIImageOrientationDownMirrored:
                transform = CGAffineTransformTranslate(transform, self.size.width, 0);
                transform = CGAffineTransformScale(transform, -1, 1);
                break;
    
            case UIImageOrientationLeftMirrored:
            case UIImageOrientationRightMirrored:
                transform = CGAffineTransformTranslate(transform, self.size.height, 0);
                transform = CGAffineTransformScale(transform, -1, 1);
                break;
    
            default:
                break;
        }
    
        // Now we draw the underlying CGImage into a new context, applying the transform
        // calculated above.
        CGContextRef ctx = CGBitmapContextCreate(NULL, self.size.width, self.size.height,
                                                 CGImageGetBitsPerComponent(self.CGImage), 0,
                                                 CGImageGetColorSpace(self.CGImage),
                                                 CGImageGetBitmapInfo(self.CGImage));
        CGContextConcatCTM(ctx, transform);
        switch (self.imageOrientation) {
            case UIImageOrientationLeft:
            case UIImageOrientationLeftMirrored:
            case UIImageOrientationRight:
            case UIImageOrientationRightMirrored:
                // Grr...
                CGContextDrawImage(ctx, CGRectMake(0,0,self.size.height,self.size.width), self.CGImage);
                break;
    
            default:
                CGContextDrawImage(ctx, CGRectMake(0,0,self.size.width,self.size.height), self.CGImage);
                break;
        }
    
        // And now we just create a new UIImage from the drawing context
        CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
        CGContextRelease(ctx);
        UIImage *img = [UIImage imageWithCGImage:cgimg];
    
        CGImageRelease(cgimg);
       //
        return img;
    }
    

    please, don-t be cruel in minusing if something looks dummy) I-m junior for now)

    For answer below - that s why you would better scale down an image - to take less memory in use, but not simply save the big 4MB image to disc. At the very begining I also had memory issues - it was eating 30Mb per sigle photo - and I had to take 2 photos one by one... now it works fine and smooth. Fix orientation is optional, but I would recommend anyway to scale down photo - resize it to smaller.

    0 讨论(0)
  • 2020-12-25 09:14

    You're on the right track with your fixRotation method. However, you should also resize the image. Otherwise, the image will be huge, ~30 MB (depending on device).

    Checkout this blog post on how to resize images correctly. Specifically, the UIImage category files you want are these:

    UIImage+Resize.h

    UIImage+Resize.m

    It's also a good idea to do this on a background thread. Something like this

    - (void)imagePickerController:(UIImagePickerController *)imagePicker didFinishPickingMediaWithInfo:(NSDictionary *)info
    {
        // Dismiss the image picker first to free its memory
        [self dismissViewControllerAnimated:YES completion:nil];
    
        UIImage *originalImage = info[UIImagePickerControllerOriginalImage];
    
        if (!originalImage)
            return;
    
        // Optionally set a placeholder image here while resizing happens in background
    
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    
            // Set desired maximum height and calculate width
            CGFloat height = 640.0f;  // or whatever you need
            CGFloat width = (height / originalImage.size.height) * originalImage.size.width;
    
            // Resize the image
            UIImage * image = [originalImage resizedImage:CGSizeMake(width, height) interpolationQuality:kCGInterpolationDefault];
    
            // Optionally save the image here...
    
            dispatch_async(dispatch_get_main_queue(), ^{
                // ... Set / use the image here...
            });           
        });
    }
    
    0 讨论(0)
  • 2020-12-25 09:21

    UIImageWriteToSavedPhotosAlbum method use 30M+ memory on iOS7.It's not about your resize or fixrotation method.

    0 讨论(0)
提交回复
热议问题