我使用react-native将图像上传到服务器。为了做到这一点,我需要从CameraRoll获取图像uri并将其转换为base64字符串,随后将上传。由于它的反应本机相当一部分在javascript中完成,我理解。但是,从asset到string64字符串的转换发生在objective-c中,我不是很流利,所以我依赖于来自不同开发人员的一些代码。一切正常,但图像的转换发生在原始缩略图而不是原始缩略图上。我想转换实际的完整图像。
@interface ReadImageData : NSObject <RCTBridgeModule>
@end
@implementation ReadImageData
RCT_EXPORT_MODULE();
RCT_EXPORT_METHOD(readImage:(NSString *)input callback:(RCTResponseSenderBlock)callback)
{
// Create NSURL from uri
NSURL *url = [[NSURL alloc] initWithString:input];
// Create an ALAssetsLibrary instance. This provides access to the
// videos and photos that are under the control of the Photos application.
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
// Using the ALAssetsLibrary instance and our NSURL object open the image.
[library assetForURL:url resultBlock:^(ALAsset *asset) {
// Create an ALAssetRepresentation object using our asset
// and turn it into a bitmap using the CGImageRef opaque type.
CGImageRef imageRef = [asset thumbnail];
// Create UIImageJPEGRepresentation from CGImageRef
NSData *imageData = UIImageJPEGRepresentation([UIImage imageWithCGImage:imageRef], 0.5);
// Convert to base64 encoded string
NSString *base64Encoded = [imageData base64EncodedStringWithOptions:0];
callback(@[base64Encoded]);
} failureBlock:^(NSError *error) {
NSLog(@"that didn't work %@", error);
}];
}
@end
显然,资产转换发生在[asset thumbnail]
。我查找了文档,并尝试将其更改为[asset originalAsset]
,这应该返回完整的图像,但我得到一个隐式转换错误。即:
目标C指针类型的隐式转换&#39; ALAsset&#39;到C指针类型&#39; CGImageRef&#39;需要一个桥梁
我尝试使用建议的解决方案,即:
(__bridge CGImageRef)([asset originalAsset])
然而,这会导致我的应用程序因此错误而崩溃:
NSInvalidArgumentException,原因: - [__ NSPlaceholderArray initWithObjects:count:]:尝试从对象插入nil对象[0]
所以我不知道该怎么办。引用代码的完整文章是here。
答案 0 :(得分:2)
取代:
CGImageRef imageRef = [asset thumbnail];
添加以下两行:
ALAssetRepresentation *rep = [asset defaultRepresentation];
CGImageRef imageRef = [rep fullScreenImage];
答案 1 :(得分:1)
我查看了文档并尝试将其更改为[asset originalAsset],这应该返回完整的图像
不,不应该。您需要更仔细地查看文档。如果已编辑此资产,originalAsset
仅是指向另一个ALAsset的指针。它不是图像。 ALAsset不是图像。
要访问图片,请浏览资产的defaultRepresentation
。这是一个ALAssetRepresentation。现在你可以得到全分辨率CGImage。