如何处理大尺寸的多张图片?

时间:2016-03-16 11:41:42

标签: image ios9 phasset photosframework

我有照片库中所选图片的列表。 数组列表包含来自照片的选定PHAssets

 <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 "

现在我想将这些图像存储到Document Directory中。为此我将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转换为原始图像时,它使用高内存设备。 请帮我解决这个问题。如果有任何其他解决方案来处理选定的PHAssets以在应用程序文档目录中存储图像,请提供给我。

2 个答案:

答案 0 :(得分: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
   }];

如果在使用更多图像时设置了最大图像尺寸,它们可能会崩溃,但如果设置了目标尺寸,则会处理它。

答案 1 :(得分:-1)

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

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

     }];

之后在文档目录路径中写入图像数据。