当我拍照时,我的内存是每个屏幕捕获的堆增长,我得到“收到内存警告”,最后 – 由于内存压力而终止. –
-(voID)imagePickerController:(UIImagePickerController *)pickerdIDFinishPickingMediawithInfo:(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 contextCGImageRef cgimg = CGBitmapContextCreateImage(ctx);//also this line in InstrumentsUIImage *img = [UIImage imageWithCGImage:cgimg];CGContextRelease(ctx);CGImageRelease(cgimg);return img; }
可能是内存管理.我会感谢你的帮助
解决方法 您使用fixRotation方法处于正确的轨道.但是,您也应该调整图像的大小.否则,图像会很大,大约30 MB(取决于设备).结帐this blog post如何正确调整图像大小.具体来说,您需要的UIImage类别文件是:
UIImage+Resize.h
UIImage+Resize.m
在后台线程上也是一个好主意.这样的东西
- (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... }); });}总结
以上是内存溢出为你收集整理的内存警告UIImagepickerController IOS 7全部内容,希望文章能够帮你解决内存警告UIImagepickerController IOS 7所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)