将 UIImages 数组转换为 base64 字符串

Posted

技术标签:

【中文标题】将 UIImages 数组转换为 base64 字符串【英文标题】:Convert an array of UIImages into base64 string 【发布时间】:2015-12-14 13:30:55 【问题描述】:

我有一个包含多个图像 (UIImage) 的数组:

NSMutableArray *myImages = [[NSMutableArray alloc] initWithArray:attachment];

我想将它作为 base64 string 和逗号传递给 API 服务器。如,(Base64String,Image1),(Base64String,Image2)等

注意:这就是我过去对不是数组的单个图像的处理方式。

(NSData *)attachment //get as a parameter

NSData *base64Data = [attachment base64EncodedDataWithOptions:0];
NSString *str = [[NSString alloc] initWithData:base64Data encoding:NSUTF8StringEncoding];
NSString *base64Image = [NSString stringWithFormat:@"%@,%@", str, @"image1"];

parameters[@"Attachment"] = base64Image; //pass to API as parameter

非常感谢您的帮助。谢谢。

【问题讨论】:

是的。它基本上是将每个图像转换为 Base 64 并推入一个大字符串。 我所做的更改在功能上与您所做的相同,只是语法更简洁。 parameters[@"Attachment"] = base64Image; 被编译器转换为[parameters setObject:base64Image forKeyedSubscript:@"Attachment"];,而setObject:forKeyedSubscript:setObject:forKey: 的别名。我强烈建议您在日常使用中使用更简洁的语法;它会让你的手指和眼睛免受不必要的压力。 见clang.llvm.org/docs/ObjectiveCLiterals.html#object-subscripting和developer.apple.com/library/mac/documentation/Cocoa/Reference/…:了解更多信息。 【参考方案1】:

在我看来,你已经拥有了你需要的一切。只需创建一个可变字符串并使用 for 循环附加每个 base64 编码图像,如下所示(快速键入且未经测试):

NSMutableString *result = [NSMutableString new];
for (int i = 0; i < myImages.count; i++) 
    NSData *base64Data = [myImages[i] base64EncodedDataWithOptions:0];
    NSString* str = [[NSString alloc] initWithData:base64Data encoding:NSUTF8StringEncoding];
    NSString *base64Image = [NSString stringWithFormat:@"(%@,%@%d),", str, @"image", i+1];
    [result appendFormat:@"%@", base64Image];

然后你可以去掉最后的逗号,得到你需要的字符串。

【讨论】:

如果 myImages 为空会让你崩溃 如果将第 3 行更改为 NSData *base64Data = [UIImagePNGRepresentation([myImages objectAtIndex:i]) base64EncodedDataWithOptions:0];它会起作用的。 @vaibby:不会。它只会将result 保留为零长度的可变字符串,并且不会一次运行循环。如果myImagesnil(而不是“空”),它将崩溃。 @vaibby 我刚刚尝试过,效果很好。有空的时候可以试试。 @SlippD.Thompson 不,如果myImagesnil,它不会崩溃。为什么会呢?如果myImagesnilmyImages.count 将简单地返回0【参考方案2】:
NSMutableArray *myImagesData = [[NSMutableArray alloc] init];
if (myImages.count != 0)
    for (int i = 0; i <= myImages.count-1; i++) 
        UIImage *img = myImages[i];
        NSData *base64Data = [img base64EncodedDataWithOptions:0];
        NSString *str = [[NSString alloc] initWithData:base64Data encoding:NSUTF8StringEncoding];
        [myImagesData addObject:str];
    

//you will get all images data in array

【讨论】:

谢谢,但您只是将图像数组放入另一个数组。这就是我所拥有的。 当我放置自我附件时,我收到此错误:“没有可见界面声明选择器附件”。因为,附件是从其他类传递的参数,它不是我的属性。 对不起,我不明白你:/ 如果循环固定为:for (NSInteger i = 0; i &lt; myImages.count; i++) ,则循环前不需要if语句。

以上是关于将 UIImages 数组转换为 base64 字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JavaScript 中使用字节数组将字符串转换为 base64 编码?

如何将图像的字节数组转换为表示 jpg 的 base64 编码字符串

如何快速将字节数组转换为 base64 字符串?

将base64字节数组转换为图像

如何将 16 位值的数组转换为 base64?

将文件转换为字节值数字数组