我知道这个问题已被多次质疑,但我的问题有点不同。我有一个图像(shared.image),我想将数据上传到服务器。这是代码(img:bit只是让服务器知道图像而不是字符串的一种方式):
NSString *imageString = [NSString stringWithFormat:@"img:%@", UIImagePNGRepresentation(shared.image)];
NSData *imageData = [imageString dataUsingEncoding:NSUTF8StringEncoding];
[shared.outputStream write:[imageData bytes] maxLength:[imageData length]];
当服务器响应(作为字符串)时,这是另一个代码(shared.array是一个数组,它在数据包碎片的情况下对所有字符串进行分组.img:bit被删除):
string = [shared.imageArray componentsJoinedByString:@""];
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
imageView.image = [UIImage imageWithData:data];
我登录[UIImage imageWithData:data]并返回nil。 我做错了什么?
由于
答案 0 :(得分:4)
当你有二进制数据时,为什么要往返NSString
?如果您想加载imageData
图片内容,则可以完全绕过NSString
:
NSData *imageData = UIImagePNGRepresentation(shared.image);
如果您的服务器接受二进制数据,那就是您所需要的。
如果它需要文本字符串,那么您建议的代码将无法完成工作,而是您应该使用类似Base64的内容对其进行编码(例如使用Matt Gallager's NSData+Base64 category)。例如:
NSData *imageData = UIImagePNGRepresentation(shared.image);
NSString *imageString = [NSString stringWithFormat:@"img:\"%@\"", [imageData base64EncodedString]];
请注意,在回复中,我建议将Base64编码的字符串括在引号中。这样,收件人可以检测到Base64编码的字符串的结尾。仅供参考,我试图尊重您img:
的界面,但您也可以考虑使用标准data URI scheme,或许类似于:
NSString *imageString = [NSString stringWithFormat:@"img:\"data:image/png;base64,%@\"", [imageData base64EncodedString]];
取决于你。
在解析服务器响应方面,再次问题是它是否是一个字符串(在这种情况下它应该是数据的Base64表示),或者它是否是二进制数据(在这种情况下,你应该只是将数据附加到NSMutableData
,然后只使用imageWithData
)。
答案 1 :(得分:4)
表示IOS> = 7
- (NSString *)imageToNSString:(UIImage *)image
{
NSData *imageData = UIImagePNGRepresentation(image);
return [imageData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
}
- (UIImage *)stringToUIImage:(NSString *)string
{
NSData *data = [[NSData alloc]initWithBase64EncodedString:string
options:NSDataBase64DecodingIgnoreUnknownCharacters];
return [UIImage imageWithData:data];
}