【问题标题】:app crash on importing greater than 8 megapixel Image to uiimageview将大于 8 兆像素的图像导入 uiimageview 时应用程序崩溃
【发布时间】:2015-07-08 05:27:35
【问题描述】:

iPhone 上导入大于 8 个megapixels 的图像时,我们的应用程序崩溃。有时内存使用率也很高。

顺便说一下,我们尝试导入的图像大于 8 兆像素,而且不是太大4000 x 3000(12 兆像素)。使用iPhone 相机拍摄的照片是3264 x 2448(8 兆像素)。

这是我们的记忆报告

导入 8 兆像素图像时


导入 12 兆像素图像时

内存使用的巨大差异。任何人都知道为什么内存使用量存在巨大差异以及对此的任何解决方案?

(我们将使用图像进行编辑、过滤、处理等)。

这是我们的代码

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    UIImage *selectedImage=[info objectForKey:UIImagePickerControllerOriginalImage];

    //SCALING UIIMAGE

    UIImage *scaledImage=[[UIImage alloc]init];
    if ((selectedImage.size.width>3264) && (selectedImage.size.height>2448))
    {
        UIGraphicsBeginImageContextWithOptions(CGSizeMake(selectedImage.size.width/2, selectedImage.size.height/2), NO, 0.0);
        NSLog(@" HEIGHT %f",selectedImage.size.height);
        NSLog(@" WIDTH %f",selectedImage.size.width);

        [selectedImage drawInRect:CGRectMake(0, 0,selectedImage.size.width/2 ,selectedImage.size.height/2 )];
       scaledImage = UIGraphicsGetImageFromCurrentImageContext();

        UIGraphicsEndImageContext();

        NSLog(@" HEIGHT %f",scaledImage.size.height);
        NSLog(@" WIDTH %f",scaledImage.size.width);


        VisualEffectImageVIew.image=scaledImage;
        BackgroundImageView.image=scaledImage;
        ForegroundImageView.image=scaledImage;
    }
    else
    {
    VisualEffectImageVIew.image=selectedImage;
    BackgroundImageView.image=selectedImage;
    ForegroundImageView.image=selectedImage;
    }
   if(UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone)
    {
        [picker dismissViewControllerAnimated:YES completion:nil];
    }
    else
    {


        [popoverController dismissPopoverAnimated:YES];

        [self popoverControllerDidDismissPopover:popoverController];
  }

}

【问题讨论】:

    标签: ios xcode memory-management uiimageview ios8.1


    【解决方案1】:

    _MGL9114.jpg 是一个图像文件。

    _MGL9114大小为3744px × 5616px

    如果我将此文件导入我的 iOS 项目并在 UIView 中渲染。它将占用 108MB 内存。因为 iOS 会实时渲染 UIImage,如果您的图像质量很高,它会使用高内存来缓存图像数据。

    如果你想减少它,你应该在后端加载 UIImage 并输出一个压缩版本。它只需要 23MB 内存。

    即使你想编辑图片,只需在压缩版本上渲染效果。当用户完成编辑后,你在后端处理所有效果(不渲染原始版本)并将原始版本保存到用户的库中.

    NSString * imageBundle = [[NSBundle mainBundle] pathForResource:@"_MGL9114" ofType:@"jpg"];
    NSData * imageData = [[NSData alloc]initWithContentsOfFile:imageBundle];
    UIImage * handleImage = [UIImage imageWithData:imageData];
    
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(handleImage.size.width/10, handleImage.size.height/10), NO, 0.0);
    [handleImage drawInRect:CGRectMake(0, 0,handleImage.size.width/10 ,handleImage.size.height/10 )];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    
    UIImageView * imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, handleImage.size.width/10, handleImage.size.height/10)];
    [imageView setImage:newImage];
    
    [self.view addSubview:imageView];
    

    【讨论】:

    • 调整所有图像的大小会出现问题,因为有些图像可能太小了,在这种情况下,如何检查图像分辨率并在它们很大时调整它们的大小以减少内存使用?
    • 从bundle加载图片后,你可以得到imageData。用NSData设置UIImage。现在你可以得到图片的大小了。
    • handleImage.size.width,handleImage.size.height。 :-)
    • 我们已编辑问题并包含代码,请查看。
    • @USERX2DX 是的,你有“selectedImage”。你已经得到了 selectedImage.size。如果图像太大,只需调整它的大小。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多