如何处理多个大尺寸的图像?
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 集中获取内存使用跳到高时它是无效的处理。以上是关于如何处理多个大尺寸的图像?的主要内容,如果未能解决你的问题,请参考以下文章