1

我知道这个问题已被多次质疑,但我的问题有点不同。我有一张图片(shared.image),我想将数据上传到服务器。这是代码(img: 位只是让服务器知道这是图像而不是字符串的一种方式):

NSString *imageString = [NSString stringWithFormat:@"img:%@", UIImagePNGRepresentation(shared.image)];
NSData *imageData = [imageString dataUsingEncoding:NSUTF8StringEncoding];
[shared.outputStream write:[imageData bytes] maxLength:[imageData length]];

当服务器响应(作为字符串)时,这是另一个代码(shared.array 是一个数组,它在数据包碎片的情况下对所有字符串进行分组。img:位被删除):

string = [shared.imageArray componentsJoinedByString:@""];
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
imageView.image = [UIImage imageWithData:data];

我 nslogged [UIImage imageWithData:data] 并返回 nil。我究竟做错了什么 ?

谢谢

4

2 回答 2

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];
}
于 2014-01-22T11:26:43.767 回答
4

NSString当你有二进制数据时,为什么要往返于 a ?如果要加载imageData图像的内容,则完全绕过NSString

NSData *imageData = UIImagePNGRepresentation(shared.image);

如果您的服务器接受二进制数据,这就是您所需要的。

如果它需要文本字符串,那么您提出的代码将无法完成这项工作,而是您应该使用 Base64 之类的东西对其进行编码(例如,使用Matt Gallager 的 NSData+Base64 类别)。例如:

NSData *imageData = UIImagePNGRepresentation(shared.image);
NSString *imageString = [NSString stringWithFormat:@"img:\"%@\"", [imageData base64EncodedString]];

请注意,在回复中,我建议将 Base64 编码的字符串括在引号中。这样,收件人就可以检测到 Base64 编码字符串的结尾。仅供参考,我已尝试尊重您的接口img:,但您也可以考虑使用标准数据 URI 方案,可能类似于:

NSString *imageString = [NSString stringWithFormat:@"img:\"data:image/png;base64,%@\"", [imageData base64EncodedString]];

由你决定。

在解析服务器响应方面,同样的问题是它是一个字符串(在这种情况下它应该是数据的 Base64 表示),还是它是否是二进制数据(在这种情况下,你应该只是附加数据到你NSMutableData,然后只是使用imageWithData)。

于 2012-12-29T15:26:47.530 回答