任何人都可以帮助我解决这个问题,我对客观的c和iOS有点新鲜.我一直在努力,但我无法弄清楚如何解决问题,我的应用程序非常简单,只有启动相机拍照并通过电子邮件发送到我们的服务器.这个代码在iOS6中工作得很好.
当我拍照时,我的内存是每个屏幕捕获的堆增长,我得到“收到内存警告”,最后 – 由于内存压力而终止. –
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { [self.popoverController2 dismissPopoverAnimated:true]; NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType]; if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) { _image = [info objectForKey:UIImagePickerControllerOriginalImage]; _image = [self fixrotation:_image]; //<----- increased memory when UIImageWriteToSavedPhotosAlbum is uncommented IF is comment it doesn't increased memory but after some pictures I start to get "Received Memory Warning" message until the app Crash. if (_newMedia){ UIImageWriteToSavedPhotosAlbum(_image,self,@selector(image:finishedSavingWithError:contextInfo:),nil); [self dismissViewControllerAnimated:NO completion:nil]; [self performSegueWithIdentifier:@"SeleccionadoCameraR" sender:self]; }else{ [self performSegueWithIdentifier:@"SeleccionadoCameraR" sender:self]; } } } - (UIImage *)fixrotation:(UIImage *)image{ if (image.imageOrientation == UIImageOrientationUp) return image; CGAffineTransform transform = CGAffineTransformIdentity; switch (image.imageOrientation) { case UIImageOrientationDown: case UIImageOrientationDownMirrored: transform = CGAffineTransformTranslate(transform,image.size.width,image.size.height); transform = CGAffineTransformRotate(transform,M_PI); break; case UIImageOrientationLeft: case UIImageOrientationLeftMirrored: transform = CGAffineTransformTranslate(transform,0); transform = CGAffineTransformRotate(transform,M_PI_2); break; case UIImageOrientationRight: case UIImageOrientationRightMirrored: transform = CGAffineTransformTranslate(transform,-M_PI_2); break; case UIImageOrientationUp: case UIImageOrientationUpMirrored: break; } switch (image.imageOrientation) { case UIImageOrientationUpMirrored: case UIImageOrientationDownMirrored: transform = CGAffineTransformTranslate(transform,0); transform = CGAffineTransformScale(transform,-1,1); break; case UIImageOrientationLeftMirrored: case UIImageOrientationRightMirrored: transform = CGAffineTransformTranslate(transform,image.size.height,1); break; case UIImageOrientationUp: case UIImageOrientationDown: case UIImageOrientationLeft: case UIImageOrientationRight: break; } // Now we draw the underlying CGImage into a new context,applying the transform // calculated above. CGContextRef ctx = CGBitmapContextCreate(NULL,CGImageGetBitsPerComponent(image.CGImage),CGImageGetColorSpace(image.CGImage),CGImageGetBitmapInfo(image.CGImage)); CGContextConcatCTM(ctx,transform); switch (image.imageOrientation) { case UIImageOrientationLeft: case UIImageOrientationLeftMirrored: case UIImageOrientationRight: case UIImageOrientationRightMirrored: // Grr... CGContextDrawImage(ctx,CGRectMake(0,image.size.width),image.CGImage); break; default: CGContextDrawImage(ctx,image.size.height),image.CGImage); //when I use instruments it shows that My VM is because of this break; } // And now we just create a new UIImage from the drawing context CGImageRef cgimg = CGBitmapContextCreateImage(ctx);//also this line in Instruments UIImage *img = [UIImage imageWithCGImage:cgimg]; CGContextRelease(ctx); CGImageRelease(cgimg); return img; }
可能是内存管理.我会感谢你的帮助
解决方法
您使用fixRotation方法处于正确的轨道.但是,您也应该调整图像的大小.否则,图像会很大,大约30 MB(取决于设备).
结帐this blog post如何正确调整图像大小.具体来说,您需要的UIImage类别文件是:
在后台线程上也是一个好主意.这样的东西
- (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... }); }); }