将 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
保留为零长度的可变字符串,并且不会一次运行循环。如果myImages
是nil
(而不是“空”),它将崩溃。
@vaibby 我刚刚尝试过,效果很好。有空的时候可以试试。
@SlippD.Thompson 不,如果myImages
是nil
,它不会崩溃。为什么会呢?如果myImages
是nil
,myImages.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 < myImages.count; i++)
,则循环前不需要if
语句。以上是关于将 UIImages 数组转换为 base64 字符串的主要内容,如果未能解决你的问题,请参考以下文章
如何在 JavaScript 中使用字节数组将字符串转换为 base64 编码?