使用 PhotoKit 获取时无法将 UIImage 转换为 NSData
Cannot convert UIImage to NSData when fetched with PhotoKit
我的情况是,我 select 使用 PhotoKit 从系统相册中获取并呈现在我的 UICollectionView
中的其中一张照片,然后传递 selected 照片(UIImage
) 到我的下一个 UIView
并以 NSData
的形式发送到远程服务器。
但是,当我在发送之前放置断点以跟踪 NSData
时,我发现 UIImage
有分配内存的数据,而 NSData
没有。
这是获取 UIImage
的代码(请注意我没有指定任何 PHImageRequestOptions
对象):
NSMutableArray *images = @[].mutableCopy;
PHImageManager *manager = [PHImageManager defaultManager];
PHAsset *asset = _photoPickerCollectionView.pickedAsset;
CGSize targetSize = CGSizeMake(asset.pixelWidth*0.5, asset.pixelHeight*0.5);
[manager requestImageForAsset:asset targetSize:targetSize contentMode:PHImageContentModeAspectFill options:nil resultHandler:^(UIImage *result, NSDictionary *info) {
_nextView.pickedOne = result;
}];
[self.navigationController dismissViewControllerAnimated:YES completion:nil];
我将 UIImage
转换为 NSData
,如下所示:
UIImage *image = _pickedOne;
NSData *imgData = UIImageJPEGRepresentation(image, imageQuality);
当我跟踪变量时,UIImage
包含如下数据:
但是 NSData
是 nil
如下:
奇怪的是,如果我为 PHImageManager
指定一个 PHImageRequestOptions
对象来请求图像,NSData
就不会是 nil
。我不确定使用或不使用 PHImageRequestOptions
会发生什么变化,以及为什么会产生如此大的差异。
更新:
我发现,如果您将 PHImageRequestOptions
指定为 nil
,那么默认选项将强制它异步获取照片,在我看来,对于 NSData
,这可能是不稳定的,所以当我指定options.synchronous = YES;
它会起作用。
但在这种情况下,它会导致任何保留周期或某些 PhotoKit
对象不会被释放吗?
该方法默认是异步的。您需要设置选项以明确使图像获取同步。我对这种转换的强烈建议是使用这个 API:
- (PHImageRequestID)requestImageDataForAsset:(PHAsset *)asset options:(nullable PHImageRequestOptions *)options resultHandler:(void(^)(NSData *__nullable imageData, NSString *__nullable dataUTI, UIImageOrientation orientation, NSDictionary *__nullable info))resultHandler;
这 returns 直接向您提供数据,但您也必须使其同步。这不会导致任何对象的任何保留周期。
希望这可以帮助。 :)
我的情况是,我 select 使用 PhotoKit 从系统相册中获取并呈现在我的 UICollectionView
中的其中一张照片,然后传递 selected 照片(UIImage
) 到我的下一个 UIView
并以 NSData
的形式发送到远程服务器。
但是,当我在发送之前放置断点以跟踪 NSData
时,我发现 UIImage
有分配内存的数据,而 NSData
没有。
这是获取 UIImage
的代码(请注意我没有指定任何 PHImageRequestOptions
对象):
NSMutableArray *images = @[].mutableCopy;
PHImageManager *manager = [PHImageManager defaultManager];
PHAsset *asset = _photoPickerCollectionView.pickedAsset;
CGSize targetSize = CGSizeMake(asset.pixelWidth*0.5, asset.pixelHeight*0.5);
[manager requestImageForAsset:asset targetSize:targetSize contentMode:PHImageContentModeAspectFill options:nil resultHandler:^(UIImage *result, NSDictionary *info) {
_nextView.pickedOne = result;
}];
[self.navigationController dismissViewControllerAnimated:YES completion:nil];
我将 UIImage
转换为 NSData
,如下所示:
UIImage *image = _pickedOne;
NSData *imgData = UIImageJPEGRepresentation(image, imageQuality);
当我跟踪变量时,UIImage
包含如下数据:
但是 NSData
是 nil
如下:
奇怪的是,如果我为 PHImageManager
指定一个 PHImageRequestOptions
对象来请求图像,NSData
就不会是 nil
。我不确定使用或不使用 PHImageRequestOptions
会发生什么变化,以及为什么会产生如此大的差异。
更新:
我发现,如果您将 PHImageRequestOptions
指定为 nil
,那么默认选项将强制它异步获取照片,在我看来,对于 NSData
,这可能是不稳定的,所以当我指定options.synchronous = YES;
它会起作用。
但在这种情况下,它会导致任何保留周期或某些 PhotoKit
对象不会被释放吗?
该方法默认是异步的。您需要设置选项以明确使图像获取同步。我对这种转换的强烈建议是使用这个 API:
- (PHImageRequestID)requestImageDataForAsset:(PHAsset *)asset options:(nullable PHImageRequestOptions *)options resultHandler:(void(^)(NSData *__nullable imageData, NSString *__nullable dataUTI, UIImageOrientation orientation, NSDictionary *__nullable info))resultHandler;
这 returns 直接向您提供数据,但您也必须使其同步。这不会导致任何对象的任何保留周期。 希望这可以帮助。 :)