1.PHImageManager問題
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是一張小圖(縮略圖)
可以通過修改成PHImageRequestOptionsDeliveryModeHighQualityFormat返回設置targetSize對應的圖片
這個坑找了很多資料才找到(iOS小菜鳥就這樣)
2.CGImageDestinationAddImageFromSource問題
+ (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大佬可以留言,求告知一下