我正在使用图像选择器库,允许用户从他们的照片库中选择许多图像.它们作为一个数组返回PHAssets.然后,我想将所有转换PHAssets为UIImages并将它们写入应用程序的存储.
目前,我正在遍历所有资产并requestImageForAsset同步调用.我的问题是,当运行此循环时,内存使用量会出现非常高的峰值(30个图像,最高可达130MB).我想阻止这个.
这是我的代码:
for(PHAsset *asset in self.assets) {
NSLog(@"started requesting image %i", i);
[[PHImageManager defaultManager] requestImageForAsset:asset targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeAspectFit options:[self imageRequestOptions] resultHandler:^(UIImage *image, NSDictionary *info) {
dispatch_async(dispatch_get_main_queue(), ^{
assetCount++;
NSError *error = [info objectForKey:PHImageErrorKey];
if (error) NSLog(@"Image request error: %@",error);
else {
NSString *imagePath = [appDelegate.docsPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%i.png",i]];
NSData *imageData = UIImagePNGRepresentation(image);
if(imageData) {
[imageData writeToFile:imagePath atomically:YES];
[self.imagesArray addObject:imagePath];
}
else {
NSLog(@"Couldn't write image data to file.");
}
[self checkAddComplete];
NSLog(@"finished requesting …Run Code Online (Sandbox Code Playgroud) 我正在使用ALAssetLibrary以从我的相机胶卷获取图像以获得我正在制作的自定义视图.这样做非常简单:
library.enumerateGroupsWithTypes(ALAssetsGroupType(ALAssetsGroupSavedPhotos), usingBlock: {
(group: ALAssetsGroup?, stop: UnsafeMutablePointer<ObjCBool>) in
if group != nil {
group!.setAssetsFilter(ALAssetsFilter.allPhotos())
var indexSet = NSIndexSet(indexesInRange: NSMakeRange(0, group!.numberOfAssets() - 1))
group!.enumerateAssetsAtIndexes(indexSet, options: nil, usingBlock: {
(result: ALAsset!, index: Int, stop: UnsafeMutablePointer<ObjCBool>) in
if (result != nil) {
var alAssetRapresentation: ALAssetRepresentation = result.defaultRepresentation()
var url = alAssetRapresentation.url()
var iRef = alAssetRapresentation.fullResolutionImage().takeUnretainedValue()
var image = UIImage(CGImage: iRef)
}
})
}
}) { (NSError) -> Void in
}
Run Code Online (Sandbox Code Playgroud)
所有这一切在模拟器中都很有效.但是在设备上,获得fullResolutionImage()证明是设备上的内存密集型并导致崩溃.我认为这很有意义,所有加载到内存中的数十个高分辨率图像都是一个糟糕的想法,所以我想缩小质量,只显示图像的缩略图.唯一的问题是我找不到从中获取缩略图的简单方法AlAssetRepresentation.
我正在尝试使用CGImageSourceCreateThumbnailAtIndex创建缩略图,但对如何执行此操作非常困惑.
任何帮助深表感谢!