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

Posted

技术标签:

【中文标题】完整图像资产未转换为 base64 字符串【英文标题】:full image asset not converting to base64 string 【发布时间】:2015-11-05 18:19:05 【问题描述】:

我正在使用 react-native 将图像上传到服务器。为此,我需要从 CameraRoll 中获取图像 uri 并将其转换为 base64 字符串,然后将其上传。由于它的反应是原生的,因此我理解其中有相当一部分是在 javascript 中完成的。但是,从asset到base64字符串的转换发生在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 指针类型“ALAsset”隐式转换为 C 指针类型“CGImageRef”需要桥接转换

我尝试使用建议的解决方案,即:

(__bridge CGImageRef)([asset originalAsset])

但是,这会导致我的应用程序因以下错误而崩溃:

NSInvalidArgumentException,原因:-[__NSPlaceholderArray initWithObjects:count:]: 尝试从 objects[0] 插入 nil 对象

所以我不确定如何进行。有参考代码的完整文章是here。

【问题讨论】:

【参考方案1】:

代替:

CGImageRef imageRef = [asset thumbnail];

添加这两行:

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

【讨论】:

【参考方案2】:

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

不,不应该。您需要更仔细地查看文档。 originalAsset 只是指向另一个 ALAsset 的指针,以防此资产已被编辑。 不是图片。 ALAsset 不是图像。

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

【讨论】:

另外,不推荐使用 ALAsset;此时您应该使用 Photo Kit 库。 这不是答案,是评论。 那里!现在我完成了。当然,我所做的只是你应该做的——我阅读了文档。 :) 这个答案会导致构建失败。当我尝试将它与 CGImage 桥耦合时,它给了我在问题中提到的相同错误。 答案不会“导致”任何事情。它不会为您编写代码。我只是回答您提出的问题 - 即,当您尝试将 ALAsset 的 originalAsset 视为图像时,为什么要尝试将其视为崩溃。这是因为它不是图像。我向你展示了图像所在的位置。想法取决于你。 (当然,阅读文档也取决于您,您也没有这样做。)

以上是关于完整图像资产未转换为 base64 字符串的主要内容,如果未能解决你的问题,请参考以下文章

将图像转换为 Base64 字符串

如果 Flutter 中的 Image Picker 未选择,则显示默认图像

将图像(按路径选择)转换为 base64 字符串

如何将图像转换为 Base64 字符串,并转换回图像,保存到 azure blob

转换为 base 64 字符串后,iOS 图像方向发生了变化

Android将base64编码的字符串转换为图像视图