完整图像资产不转换为base64字符串

时间:2015-11-05 18:19:05

标签: ios objective-c reactjs base64 react-native

我使用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

2 个答案:

答案 0 :(得分:2)

取代:

CGImageRef imageRef = [asset thumbnail];

添加以下两行:

ALAssetRepresentation *rep = [asset defaultRepresentation];
CGImageRef imageRef = [rep fullScreenImage];

答案 1 :(得分:1)

  

我查看了文档并尝试将其更改为[asset originalAsset],这应该返回完整的图像

不,不应该。您需要更仔细地查看文档。如果已编辑此资产,originalAsset仅是指向另一个ALAsset的指针。它不是图像。 ALAsset不是图像。

要访问图片,请浏览资产的defaultRepresentation。这是一个ALAssetRepresentation。现在你可以得到全分辨率CGImage。