PHAsset *phAsset = asset;
PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
//ptions.deliveryMode = PHImageRequestOptionsDeliveryModeFastFormat;
//是保證 resultHandler 值回調一次,不然可能回回調屢次,只有最後一次返回的圖片大小等於設置的 targetSize
options.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
options.resizeMode = PHImageRequestOptionsResizeModeExact;
options.synchronous = YES;
options.networkAccessAllowed = YES;
CGSize imageSize = [UIImage getImageSizeWithAsset:phAsset];
[[PHImageManager defaultManager] requestImageForAsset:phAsset targetSize:imageSize contentMode:PHImageContentModeAspectFill options:options resultHandler:^(UIImage *result, NSDictionary *info) {
NSMutableData *imageData = [UIImage writeMetaDataWithData:result asset:phAsset];
[imageData writeToFile:imagePath atomically:YES];
[[UIImage getSmallImageWithImage:result] writeToFile:smallImagePath atomically:YES];
}];
複製代碼
常規使用狀況下deliveryMode 使用PHImageRequestOptionsDeliveryModeFastFormat 在iOS 13時候調用requestImageForAsset會出現result是一張小圖(縮略圖)bash
能夠經過修改爲PHImageRequestOptionsDeliveryModeHighQualityFormat返回設置targetSize對應的圖片ui
這個坑找了不少資料才找到(iOS小菜鳥就這樣)atom
+ (NSMutableData *)writeMetaDataWithData:(NSMutableData *)imageData metaDataDic:(NSDictionary *)metaDataDic {
NSMutableData *mutableData = [NSMutableData data];
CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)imageData, NULL);
CGImageDestinationRef destination = CGImageDestinationCreateWithData(
(__bridge CFMutableDataRef)mutableData, CGImageSourceGetType(cgImage), 1, nil);
CGImageDestinationAddImageFromSource(destination, source, 0, (__bridge CFDictionaryRef)metaDataDic);
CGImageDestinationFinalize(destination);
CFRelease(source);
CFRelease(destination);
return mutableData;
// CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)imageData, NULL);
// CFStringRef UTI = CGImageSourceGetType(source);
// CGImageDestinationRef destination = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)imageData, UTI, 1, NULL);
// CGImageDestinationAddImageFromSource(destination, source, 0, (__bridge CFDictionaryRef)metaDataDic);
// CGImageDestinationFinalize(destination);
// return imageData;
}
複製代碼
上面的方法使用註釋的代碼,在iOS 13上面會致使imageData 被清空爲0byte,而後使用新建立一個NSMutableData 卻沒有這個問題,不知道是啥狀況,有知道的iOS大佬能夠留言,求告知一下spa