如何处理多个大尺寸的图像?

Posted

技术标签:

【中文标题】如何处理多个大尺寸的图像?【英文标题】:How to handle multiple images with large size? 【发布时间】:2016-03-16 11:41:41 【问题描述】:

我有从照片库中选择的图像列表。 数组列表包含从照片中选择的 PHAsset

 <PHAsset: 0x131334350> 768AD8BA-FE7A-4EE9-B2CF-4DD4AEBE2AE9/L0/001 mediaType=1/0, sourceType=1, (2448x3264), creationDate=2016-03-11 06:50:09 +0000, location=1, hidden=0, favorite=0 ",
"<PHAsset: 0x131334260> CA962E42-A367-4E8D-85C8-934F8C76FE78/L0/001 mediaType=1/0, sourceType=1, (2448x3264), creationDate=2016-03-11 06:50:08 +0000, location=1, hidden=0, favorite=0 "

现在我想将此图像存储到文档目录中。为此,我将 PHAssets 转换为原始图像并将其存储在数组中,对于我所做的代码

  @property (nonatomic, strong) PHImageRequestOptions *requestOptions;

  for (PHAsset *asset in assetArray) 
      self.requestOptions = [[PHImageRequestOptions alloc] init];
      self.requestOptions.resizeMode   = PHImageRequestOptionsResizeModeExact;
      self.requestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;

    // this one is key
    self.requestOptions.synchronous = true;
    PHImageManager *manager = [PHImageManager defaultManager];
    __block UIImage *ima;
        // Do something with the asset
        [manager requestImageForAsset:asset
                           targetSize:PHImageManagerMaximumSize
                          contentMode:PHImageContentModeDefault
                              options:self.requestOptions
                        resultHandler:^void(UIImage *image, NSDictionary *info) 
                            ima = image;

                            [Albumimages addObject:ima];

                        ]; 

但问题是,当我选择多个大尺寸(超过 25 个)图像时,应用程序崩溃了。因为当我使用 PHImageManager 将 PHAsset 转换为原始图像时,它会使用设备的高内存。 请帮我解决这个问题。如果有任何其他解决方案来处理选定的 PHAsset 以将图像存储在应用程序文档目录中,请提供给我。

【问题讨论】:

【参考方案1】:
 PHImageRequestOptions *option = [PHImageRequestOptions new];
 option.synchronous = NO;

let screenSize: CGSize = UIScreen.mainScreen().bounds.size
let targetSize = CGSizeMake(screenSize.width, screenSize.height)

 [manager requestImageForAsset:asset
                    targetSize:target 
                   contentMode:PHImageContentModeAspectFill 
  options:option resultHandler:^(UIImage *result, NSDictionary *info) 
  
        //this block will be called synchronously
   ];

如果您在使用更多图像时设置最大图像大小,它们可能会崩溃,但如果设置目标大小然后处理它。

【讨论】:

【参考方案2】:

使用数据处理所有图像,而不是转换为原始图像。

     [manager requestImageDataForAsset:asset
                              options:self.requestOptions
                        resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info)
     
        // UIImage *image = [UIImage imageWithData:imageData];
         [Albumimages addObject:imageData];

     ];

然后将图像数据写入文档目录路径。

【讨论】:

当大的原始尺寸图像从 PHAsset 集中获取内存使用跳到高时它是无效的处理。

以上是关于如何处理多个大尺寸的图像?的主要内容,如果未能解决你的问题,请参考以下文章

Viola-Jones 人脸检测器如何处理多种尺寸的人脸?

SpriteKit - 如何处理多种屏幕尺寸?

如何处理大维度表

如何处理 Web 图片优化?

如何处理所有可用 iPhone 分辨率的图像比例?

如何处理重叠 Mousareas 中的按下和释放信号?